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++の値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
于 2012-10-11T20:38:49.893 に答える