前端 - 关于JavaScript用实例的.__proto__修改构造函数的原型对象的问题

查看:154
本文介绍了前端 - 关于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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆