2012-10-11 67 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