search

Home  >  Q&A  >  body text

前端 - 关于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吗?

PHP中文网PHP中文网2820 days ago291

reply all(1)I'll reply

  • 高洛峰

    高洛峰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 = ...

    reply
    0
  • Cancelreply