Prototype Access&行为

时间:2017-11-16 01:59:00

标签: javascript prototype prototypal-inheritance

1.1:为什么直接在x上访问linkingObject无效但在linkingObject.prototype上访问它?

1.2:在linkingObject搜索x后,默认情况下该引擎不应该搜索其原型x?为什么我需要明确说明.prototype

1.3:为了进一步说明这是多么奇怪,您可以看到baseObjectlinkingObject的原型,它甚至声明它包含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 }

1 个答案:

答案 0 :(得分:0)

您已将函数对象的prototype属性与对象的继承链中的第一个条目混淆。后者通常写成[[prototype]],因为它是一个内部值,指的是继承链的开始。

对象的[[prototype]]内部属性(称为“slot”)设置为其构造函数的prototype属性,或者对于Object.create创建的对象,作为第一个参数提供的对象值。

因此,您将linkingObject的[[prototype]]值设置为函数baseObject。搜索linkingObject会在继承链中找到prototype(它是baseObject的属性),然后查找linkingObject.prototype.x作为继承的prototype值的已定义属性。

baseObject该函数本身没有x属性,因此搜索不存在的linkingObject.x属性会返回undefined