这段代码:
function A(){}
A.prototype = {
a : 5
}
var b = new A();
console.log('b.a : ' + b.a);
A.prototype = {
a : 10
}
console.log('b.a : ' + b.a);
产生:
b.a:5
b.a:5
虽然下面的代码修改了 A 现有实例的原型(prototype):
function A(){}
A.prototype = {
a : 5
}
var b = new A();
console.log('b.a : ' + b.a);
A.prototype.a = 10;
console.log('b.a : ' + b.a);
并产生:
b.a:5
b.a:10
怎么会这样?
最佳答案
prototype
和 [[prototype]]
(或 __proto__
)之间的混淆。
前者是一个(正常的、非魔法的)属性,在从构造函数创建的任何对象中将被设置为后者(这是内部的,通常不要弄乱)。因此,当您执行 b = new A()
时,A
的 prototype
变为 b
的 [[原型(prototype)]]
。当我们说在 JavaScript 中属性首先在对象上查找,然后在原型(prototype)链上查找时,就是这个 [[prototype]]
的意思。
当您在第二种情况下更改 A.prototype.a
时,您同时更改了 b
的 [[prototype]]
时间(因为它是同一个对象)。
当您将新对象分配给 A.prototype
时,它不再与 b
的 [[prototype]]
是同一对象>。因此,b.a
与 A.prototype.a
分离。
关于javascript - 修改对象的原型(prototype)可能会也可能不会影响这些实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31263285/