就在我以为我已经弄清楚了 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};
}
这看起来真的很不正统(我需要手动重新初始化属性,但前提是它们是参考对象)。
任何人都可以阐明发生了什么吗?