JSを理解したと思ったとき、私はこれに夢中になりました:
function Obj() {
console.log('x: %s, o.x: %s', this.x++, this.o.x++);
}
Obj.prototype.x = 1;
Obj.prototype.o = {x: 1};
期待される:
> new Obj
x: 1, o.x: 1
> new Obj
x: 1, o.x: 1
> new Obj
x: 1, o.x: 1
実際:
> new Obj
x: 1, o.x: 1
> new Obj
x: 1, o.x: 2
> new Obj
x: 1, o.x: 3
そのため、プロトタイプ プロパティが参照型の場合はすべてのインスタンスで共有されますが、非参照型の場合はインスタンスごとに再初期化されるようです。この仮説を確認するために、 (のstring
ように動作するnumber
) やarray
(のように動作する) など、他のいくつかのタイプをテストしましたobject
。
次のように、ctor でオブジェクト プロパティを再初期化すると、この落とし穴を回避できると判断しました。
function Obj() {
this.o = {x: 1};
}
これは本当に非正統的なようです(プロパティを手動で再初期化する必要がありますが、それらが参照オブジェクトである場合のみ)。
何が起こっているのか、誰かが光を当てることができますか?