这段代码:
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:
的现有实例的原型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
怎么回事?
答案 0 :(得分:1)
prototype
和[[prototype]]
(或__proto__
)之间的混淆。
前者是一个(普通的,非魔法的)属性,它将被设置为从构造函数创建的任何对象中的后者(内部,通常不会被混淆)。因此,当您执行b = new A()
时,A
的{{1}}变为prototype
的{{1}}。当我们说在JavaScript中首先在对象上查找属性然后向上查找原型链时,就是这个b
。
在第二种情况下更改[[prototype]]
时,您同时更改了[[prototype]]
的{{1}}(因为它是同一个对象)。
将新对象分配给A.prototype.a
时,它不再是b
的{{1}}对象。因此,[[prototype]]
与A.prototype
分开。
答案 1 :(得分:0)
您需要阅读本文以更好地理解JavaScript对象模型。