javascript - 使用 Object.create(null) 创建对象时 __proto__ 如何工作

标签 javascript inheritance prototype prototype-chain

考虑以下 javascript 代码

var a = Object.create(null);
a.foo = 1;
var b = Object.create(a);
console.log(b.foo);  //prints 1
console.log(b.__proto__);  //prints undefined
b.__proto__ = null;
console.log(b.__proto__);  //prints null
console.log(b.foo);  //prints 1

即使在将 b.__proto__ 设置为 null 之后,谁能解释对象 b 如何访问 a 的“foo”属性?用于访问a 属性的内部链接是什么?

我尝试在 SO 中搜索可能的解释,但找不到任何关于 Javascript 的这种特殊行为的解释。

最佳答案

您的问题是您使用的是 deprecated __proto__ property ,它是 Object.prototype 上的 getter/setter - 但您的对象不会继承自它,所以它首先是 undefined 并且赋值创建一个标准属性名称 __proto__

使用正确的 Object.getPrototypeOf/Object.setPrototypeOf相反,代码将执行您期望的操作:

var a = Object.create(null);
a.foo = 1;
var b = Object.create(a);
console.log(b.foo); // 1
console.log(Object.getPrototypeOf(b)); // {foo:1} - a
Object.setPrototypeOf(b, null);
console.log(Object.getPrototypeOf(b)); // null
console.log(b.foo); // undefined

关于javascript - 使用 Object.create(null) 创建对象时 __proto__ 如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45072853/

相关文章:

javascript - jQuery 返回 true 但如果正确则不输入

c++ - 为什么动态绑定(bind)没有按预期运行?

javascript:对于同一类的不同对象,将数组复制到不同的变量中

javascript - 阵列拼接原型(prototype)

javascript - 如何有两个后备图像占位符

javascript - React.js - 处理愚蠢 child 状态的模式?

javascript - 使用正则表达式在JS中进行密码验证

Swift继承函数返回类型不能是子类型

java - 子类之间的组合

c++ - 为什么这段代码不起作用? (原型(prototype)中的 &array)