$ 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。
答案 0 :(得分: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
答案 1 :(得分: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++; }
在创建Node 的新实例时会调用 var Node = function(){ this.someval = Node.next_id++; }
Node.next_id = 0;
var node2 = new Node();
node2.somval // 0;
Node.next_id // 1
使用以下代码:
{{1}}