刚刚做了个实验,表示结果理解不能= =
根据红宝书的解释,实例的.__proto__即指向构造函数的原型对象,那么我想如果修改一个实例的.__proto__的某一属性,则所有由该构造函数创建的实例的该属性都会被修改。
然而,结果却是这样的:
function Person (){}
Person.prototype.name = 'jack';
Person.prototype.age = 19;
var a = new Person();
a.__proto__.name = 'mary';
console.log('a proto :',a.__proto__);
console.log('person prototype:',Person.prototype);
显示:
a proto : Person {name: "mary", age: 19}
person prototype: Person {name: "mary", age: 19}
而如果这样稍微改动一下的话:
function Person (){}
Person.prototype.name = 'jack';
Person.prototype.age = 19;
var a,b = new Person();
a.__proto__.name = 'mary';
console.log('a proto :',a.__proto__);
console.log('person prototype:',Person.prototype);
console.log('b name:',b.name);
结果就变成了:
a proto : Person {name: "mary", age: 19}
person prototype: Person {name: "jack", age: 19}
b name: jack
为什么多了一个b,结果就不一样了呢?
用a.__proto__修改了构造函数的原型对象,b的name属性也来自于这个原型对象的话,难道b.name不应该也同时被修改为mary吗?
高洛峰2017-04-10 17:13:47
var a,b = new Person();
console.log(a); //结果是什么呢?
a.__proto__ === Person.prototype //相等吗?
实际上a和Person还有b在__proto__上并没有什么联系,
var a,b = ...
a不等于b
改成下面这样就可以了var a = b = ...