javascript - 为什么下面的代码 `p.__proto__.aa`不等于200?

标签 javascript prototype

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)链以查找该属性。但是:

p.aa = 200

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

关于javascript - 为什么下面的代码 `p.__proto__.aa`不等于200?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38333148/

相关文章:

javascript - 如何将点击事件附加到 css 样式的复选框

javascript - 为什么 "this"in function inside angularjs service be undefined

JavaScript .bind()方法简单测试

javascript - 问答游戏的计时器在重新启动时不断加快

javascript - 通过iron-ajax初始化对象数组(链接响应到调用者的元素)

javascript - 如何在悬停另一个 HTML 元素时创建平滑缩放并显示叠加层?

javascript - 容器中的中心文本 (EaselJS)

javascript - 难以手动走原型(prototype)链

javascript - 我可以使用 `obj.constructor === Array` 来测试对象是否为数组吗?

javascript - three.js ES6 如何只导入特定模块