我试图找出我编写的函数的原型链
function Animal(voice)
{
this.voice = voice|| 'meaw'
}
Animal.prototype.speak =function() {
console.log(this.voice);
}
我知道Animal函数具有一个原型属性,该属性指向它的原型对象。它的原型对象具有指向后方的构造函数和指向Object对象原型的__proto__属性。
我知道每个函数对象都继承自Function的对象原型,并且继承自Object的对象原型,包括__proto__属性。现在,当我进一步研究它时,我发现Function的对象原型和__proto__属性链接到同一原型对象。
console.log(Animal.__proto__.constructor.__proto__ == Animal.__proto__.constructor.prototype ); //true
console.log(Animal.__proto__.constructor.__proto__ == Animal.__proto__); //true
然后我做了进一步的测试以证明这一点
Animal.__proto__.constructor.__proto__.test = 28;
console.log(Animal.__proto__.constructor.__proto__.test); // prints 28
console.log(Animal.__proto__.test); //prints 28
这意味着它的原型与继承的原型是相同的。设置它的原因为何?
最佳答案
您已经知道Object.getPrototypeOf(Animal)
(或Animal.__proto__
)是Function.prototype
object。因此,让我们放下Animal
东西,然后用Function.prototype
重复您的方程式:
Function.prototype.constructor.__proto__ == Function.prototype.constructor.prototype // true
Function.prototype.constructor.__proto__ == Function.prototype // true
现在,
.constructor
的Function.prototype
属性(就像所有定义良好的原型对象一样)指向其各自的构造函数Function
constructor function。所以我们有Function.__proto__ == Function.prototype // true
Function.__proto__ == Function.prototype // true
现在,假定
Function
是一个函数,则它像所有其他函数一样从Function.prototype
继承才有意义。正如您基本上所做的那样,这就是您的测试所证实的
Function.__proto__.test = 28;
Function.__proto__.test // 28
Function.prototype.test // 28
是的,
Function.test
和Animal.test
现在也会产生28
。关于javascript - 函数对象__proto__和原型(prototype)属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35342916/