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

Pri*_*jit 7 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
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释对象即使在设置为null 后如何b访问"foo"属性?用于访问属性的内部链接是什么?ab.__proto__a

我试图通过SO搜索可能的解释,但找不到任何解释Javascript的这种特殊行为.

Ber*_*rgi 7

您的问题是您正在使用不推荐使用的 __proto__属性,它是一个getter/setter on Object.prototype- 但是您的对象不会继承该对象,所以它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
Run Code Online (Sandbox Code Playgroud)