为什么功能的原型必须是它的子代?

时间:2019-03-01 16:23:03

标签: javascript

function Person(){}
person1 = new Person()
console.log(person1.constructor === Person) //true: makes sense

console.log(Person.prototype.constructor === Person) //true: Why

console.log(Person.prototype instanceof Person) //false: Why

在上面的代码片段中,person1对象是使用Person构造函数创建的。 person1对象的构造函数是Person,这对我来说很有意义。

但是在创建Person时也创建了Person.prototype

多年以来,我一直认为Person.prototype的构造者是Object。但是今天我发现它实际上是Person本身。

老实说,我无法消化这个启示。

为什么某个功能的Prototype必须是其子级?其背后的想法是什么?

另外,很奇怪:Person.prototype instanceof Person === false

请解释。

2 个答案:

答案 0 :(得分:1)

Javascript定义了函数原型属性上的默认对象将具有构造函数属性,并将其引用回该函数。

您为什么看到

Person.prototype.constructor === Person // true

现在

Person.prototype instanceof Person

返回false ,因为Person.prototype不是Person的实例,而是为Person本身定义的对象。原型对象具有两个属性constructor,它们分别指向上述的Person对象和__proto__

但是,如果您选中

person1 instanceof Person 

它将返回您为真

答案 1 :(得分:0)

请注意,person1本身没有.constructor属性,它是从Person.prototype继承的。这就是Person.prototype.constructor = Person的全部原因-不是因为原型对象是通过Person构造的(不是),而是因为person1继承这个值是有意义的。