在Javascript中分配唯一ID

时间:2012-10-11 20:33:35

标签: javascript

$ 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。

2 个答案:

答案 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}}
相关问题