@Bergi 的回答是正确的。这是__proto__的情况下发生的深入答案
var a = Object.create({});
var b = Object.create(a);
b.__proto__===a; //true
var c = Object.create(null);
var d = Object.create(c);
d.__proto__===c; //false..confusion
Object.hasOwnProperty.call(d,"__proto__"); //false as expected
Object.hasOwnProperty.call(b,"__proto__"); //false ?
Object.hasOwnProperty.call(Object,"__proto__"); //false
Object.hasOwnProperty.call(Object.prototype,"__proto__"); //true
这意味着__proto__ 仅存在于Object.prototype。
Object.getOwnPropertyDescriptor(Object.prototype,"__proto__")
//{enumerable: false, configurable: true, get: ƒ, set: ƒ}
__proto__ 是一个 getter 设置器,它应该返回到对象父对象的内部链接,例如
get __proto__(){return this.hidden_internal_link_to_parent;}
案例b.__proto__:- b 没有__proto__ 属性,所以它通过[[prototype]] 链到a,然后到a 的父级,最后到Object.prototype。 Object.prototype 有__proto__,它返回b 的父级链接a。
案例d.__proto__:- d 到Object.prototype 的链接已损坏(d --parent-->c 和 c--parent-->null)。所以d.__proto__ 是未定义的。但是d 有指向c 的内部链接,可以通过Object.getPrototypeOf(d) 访问。