考虑一个基本示例,我试图请求对象中不存在的属性案例一:(一般对象)var obj1 = { name: "Jack", age: 29} console.log(obj1.city); 回答: undefined这意味着如果存在不存在的属性,则正确地称为undefined.案例二:(对象构造器)现在,我要做同样的事情——首先创建一个继承自的字符串,String Constructor继承自Object Constructor。__proto__Object-Constructor 没有名为的属性,__proto__因此答案应该是未定义的。而是(奇怪地)它返回null。这是无法理解的。As far as I know, if the property of an Object is not found - its value should be `**undefined**` and not `**null**`. 现在,请有人帮助理解 - 在上升之后,prototype chain概念和实现应该保持不变。所以,如果没有找到 的__proto__属性,为什么答案不Object Constructor应该是???undefinednull
1 回答
慕勒3428872
TA贡献1848条经验 获得超6个赞
Javascript 的设计方式位于每个对象null的原型链的顶部。正如规范所说,对于内部方法,它的类型签名是,它:GetPrototypeOf( ) → Object | Null
确定为该对象提供继承属性的对象。空值表示没有继承的属性。
访问__proto__对象的属性或使用Object.getPrototypeOf将调用该内部方法。该__proto__属性确实存在于大多数对象上(因此它不返回undefined),但不保证调用它的对象具有内部原型(如果没有,则该操作返回null)。
看看__proto__getter/setter 如何Object.prototype:
console.log(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__'));
对于通过 的任何对象,该属性都将存在Object.prototype,大多数情况下都是如此。吸气剂可能会返回null。
请注意,如果您创建一个不继承自的对象,则Object.prototype该__proto__属性将不在原型链中,您将获得undefined:
const obj = Object.create(null);
console.log(obj.__proto__);
添加回答
举报
0/150
提交
取消
