修改对象的原型可能会也可能不会影响这些实例

时间:2015-07-07 08:18:43

标签: javascript

这段代码:

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

怎么回事?

2 个答案:

答案 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对象模型。

MDN JavaScript - Details_of_the_Object_Model