2012-10-11 59 views
0
$ var Node = function(){ this.someval = 0; } 
undefined 
$ var node = new Node(); 
undefined 
$ node.someval 
0 
$ Node.next_id = 0 
0 
$ Node.prototype.constructor = function() { this.someval = Node.next_id++; } 
function() { this.someval = Node.next_id++; } 
$ var node2 = new Node(); 
undefined 
$ node2.someval 
0 
$ var node3 = new Node(); 
undefined 
$ node3.someval 
0 

爲什麼next_id ++按預期工作?我期待next_id隨着每次調用new Node()而增加,從而爲每個節點分配一個新的id。在Javascript中分配唯一標識號

+3

設置「原型」對象的「構造函數」屬性不會做你看起來想象的那樣。 – Pointy

+2

'Node.prototype.constructor = function(){this.someval = Node.next_id ++; }'不會自動改變'Node'。 –

+0

我看到了,所以我不得不說var Node = function(){this.someval = Node.next_id ++; } – lowerkey

回答

1

控制檯顯示this.someval的正確值。 在this.someval = Node.next_id++的情況下,Node.next_id的值將被分配給this.someval,那麼它將增加值Node.next_id

嘗試:

> var i = 0; //undefined 
    > var j = i++; //undefined 
    > i; //1 
    > j;//0 

function() { this.someval = Node.next_id++; }當你創建節點的新實例

使用下面的代碼會被調用:

var Node = function(){ this.someval = Node.next_id++; } 
Node.next_id = 0; 
var node2 = new Node(); 
node2.somval // 0; 
Node.next_id // 1 
3

有與Node.prototype.constructor關聯的特殊行爲。將其設置爲某個值除了賦值之外沒有副作用。

你可以給它任何你想要的值:

Node.prototype.constructor = "foobar"; 

...會有不修改Node構造。換句話說,它只是一個普通的舊循環引用。


要做你想做的事,在構造函數中做增量。

var Node = function(){ this.someval = Node.next_id++; }; 

Node.next_id = 0; 

你也應該注意到,沒有什麼特別之處的Node構造分配財產。

Node.foo = "bar"; // doesn't impact the behavior of the constructor 

它所做的是一個屬性添加到函數對象,但對通過Node構造函數構造的對象絕對沒有影響。

所以你在做什麼是使用Node函數對象作爲命名空間。這很好,但我會親自使用閉包。

var Node = (function() { 

    var next_id = 0; 

    return function Node() { this.someval = next_id++; }; 

})(); 

這使得next_id望洋興嘆了立即調用函數之外的任何代碼,給它從外部修改了一些保護。這是一種非常普遍的模式。

var node2 = new Node(); 
node2.someval; // 0 

var node3 = new Node(); 
node3.someval; // 1