前端 - 关于JavaScript用实例的.__proto__修改构造函数的原型对象的问题
本文介绍了前端 - 关于JavaScript用实例的.__proto__修改构造函数的原型对象的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
刚刚做了个实验,表示结果理解不能= =
根据红宝书的解释,实例的.__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吗?
解决方案
var a,b = new Person();
console.log(a); //结果是什么呢?
a.__proto__ === Person.prototype //相等吗?
实际上a和Person还有b在__proto__上并没有什么联系,
var a,b = ...
a不等于b
改成下面这样就可以了var a = b = ...
这篇关于前端 - 关于JavaScript用实例的.__proto__修改构造函数的原型对象的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文