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。

4

2 回答 2

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
于 2012-10-11T20:47:24.680 回答
1

控制台显示 this.someval 的正确值。因为如果this.someval = Node.next_id++值 ofNode.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
于 2012-10-11T20:38:49.893 回答