构造函数属性:__ proto __。constructor vs prototype.constructor

问题描述 投票:1回答:1

我是Javascript的新手,我正在深入挖掘并理解继承,构造函数和原型链。所以,我创建了一个构造函数,

var a = function(){this.integer=1,this.float=1.0,this.string="one"}

现在,这个函数有一个prototype.constructor属性,一个构造函数属性和一个__proto__.constructor属性。

据我所知,__proto__.constructor ==执行构造函数来创建函数a。此外,prototype.constructor是我使用new关键字创建'a'实例时执行的函数。

但是我不明白第三个构造函数属性是什么。它等于__proto__.constructor

另外,b.__proto__.constructor!== Object.prototype.constructor,正如我想的那样。这是为什么 ?

javascript prototype prototype-chain
1个回答
3
投票

a.__proto__Function原型(即Function.prototype)。它是所有函数继承特定于函数的方法的对象,如callapplybind等。确实,a.__proto__.bind == a.bind

a.__proto__.constructorFunction构造函数,即函数FunctionFunction原型通过constructor属性引用其关联的构造函数,因为它始终是原型对象和构造函数之间的默认关系。 (更多关于这两段中的“默认关系”。)

完全不同的是a.prototype - 在JavaScript中,任何函数都可以是构造函数,即可以使用new调用它。每当使用new调用函数时,它会创建一个新对象,其__proto__是函数的prototype,并通过this指向新创建的对象。因此,在对new a()的调用中,this.__proto__等于a.prototype。在定义函数a.prototype时,此原型对象将自动创建并存储在a中。

a.prototype.constructor等于a,因为为新定义的函数创建prototype对象的JavaScript内部例程(如前一段所述)总是为新原型提供引用新定义函数的constructor属性。为了真正进入杂草,相关的ECMAScript例程是19.2.1.1.1, CreateDynamicFunction,它指出:“为使用CreateDynamicFunction创建的每个函数自动创建一个prototype属性,以提供该函数将用作构造函数的可能性。”

a没有自己的constructor属性,但它自动继承a.__proto__.constructor可访问的a.constructor,就像它继承其原型父类的任何其他属性一样(就像a.bind真的是a.__proto__.bind)。

最后,a.__proto__.constructor !== Object.prototype.constructor因为Object.prototype不是函数对象的原型父类,而是Function.prototype。相反,a.__proto__.constructor === Function.prototype.constructor(更简洁地说,a.__proto__ == Function.prototypea.__proto__.constructor == Function)是真的。

© www.soinside.com 2019 - 2024. All rights reserved.