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

时间:2019-02-19 19:59:37

标签: javascript prototype prototype-chain

我对Java语言还很陌生,我试图深入研究并理解继承,构造函数和原型链。 因此,我这样创建了一个构造函数,

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。为什么会这样?

1 个答案:

答案 0 :(得分: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,因为JavaScript内部例程会为新定义的函数(如上一段中所述)创建prototype对象,这总是为新原型提供{引用新定义函数的{1}}属性。为了真正进入杂草,相关的ECMAScript例程为19.2.1.1.1, CreateDynamicFunction,该例程指出:“将为使用CreateDynamicFunction创建的每个函数自动创建一个constructor属性,以提供使用该函数的可能性作为构造函数。”

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.constructora.__proto__ == Function.prototype)。