1.1:为什么直接在x
上访问linkingObject
无效但在linkingObject.prototype
上访问它?
1.2:在linkingObject
搜索x
后,默认情况下该引擎不应该搜索其原型x
?为什么我需要明确说明.prototype
?
1.3:为了进一步说明这是多么奇怪,您可以看到baseObject
是linkingObject
的原型,它甚至声明它包含x
属性。
const baseObject = function() {};
baseObject.prototype.x = 5;
const linkingObject = Object.create(baseObject);
console.log(linkingObject.x); // 1.1: undefined
console.log(linkingObject.prototype.x); // 1.2: 5
console.log(linkingObject.prototype); // 1.3: baseObject { x:5 }
答案 0 :(得分:0)
您已将函数对象的prototype
属性与对象的继承链中的第一个条目混淆。后者通常写成[[prototype]]
,因为它是一个内部值,指的是继承链的开始。
对象的[[prototype]]内部属性(称为“slot”)设置为其构造函数的prototype
属性,或者对于Object.create
创建的对象,作为第一个参数提供的对象值。
因此,您将linkingObject
的[[prototype]]值设置为函数baseObject
。搜索linkingObject
会在继承链中找到prototype
(它是baseObject
的属性),然后查找linkingObject.prototype.x
作为继承的prototype
值的已定义属性。
但baseObject
该函数本身没有x
属性,因此搜索不存在的linkingObject.x
属性会返回undefined
。