我对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
。为什么会这样?
答案 0 :(得分:3)
a.__proto__
是Function
原型(即Function.prototype
)。该对象是所有函数都从其继承诸如call
,apply
,bind
等特定于函数的方法的对象。确实是a.__proto__.bind == a.bind
。
a.__proto__.constructor
是Function
的构造函数,即函数Function
。 Function
原型通过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.constructor
和a.__proto__ == Function.prototype
)。