【问题标题】:Why the following code, `p.__proto__.aa` does not equal to 200? [duplicate]为什么下面的代码 `p.__proto__.aa` 不等于 200? [复制]
【发布时间】:2016-07-12 15:28:19
【问题描述】:
function Person(name,age){
    this.name = name
    this.age = age;
}
Person.prototype.home = [1,2,3];
Person.prototype.aa =100;
var p = new Person('joy','7');


console.log(p.__proto__.home); //[1,2,3]
console.log(p.__proto__.aa); // 100

p.aa = 200; 
p.home[0] = 200; 

console.log(p.__proto__.home); //[200,2,3]
console.log(p.__proto__.aa); // 100 

为什么 p.__proto__.home 已更改。在我看来,p.aa = 200; 改变了p.__proto__.aa,但事实并非如此。

为什么知道原因?请写更多细节。
哪本书与内容相关?

【问题讨论】:

标签: javascript prototype


【解决方案1】:

当您尝试访问对象上不存在的属性时,Javascript 将遍历原型链以查找该属性。然而:

p.aa = 200

这会将属性aa 直接分配给对象。该对象现在作为属性.aa,并且它还具有.__proto__.aa作为两个独立的属性。您不会通过分配给.aa 来间接修改原型。

【讨论】:

  • 基本上是 var p = {aa:200},对吗?我们不会改变原型。 (我不是操作者,只是想知道)
  • 嗯,你正在彻底替换对象,这意味着它也失去了它的__proto__...忽略那个细节,是的,这就是你正在做的。
  • 失去_proto是什么意思?
  • 您刚刚通过完全重新定义p 替换了整个对象。如果它是p.aa = 200,就像在 OP 的代码中那样,整个对象没有被替换,那么稍后添加的自己的属性不会覆盖原型链中已经存在的属性的事实是问题
  • @cresjoy OP 的 pp.__proto__.aa。当您使用p = {..} 时,新的p 现在没有p.__proto__.aa
【解决方案2】:

p.__proto__.home 未更改。它引用的数组已更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2022-11-27
    • 1970-01-01
    相关资源
    最近更新 更多