我试图找出我编写的函数的原型链

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


现在,.constructorFunction.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.testAnimal.test现在也会产生28

关于javascript - 函数对象__proto__和原型(prototype)属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35342916/

10-13 06:01