我是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
,正如我想的那样。这是为什么 ?
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
,因为为新定义的函数创建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.prototype
和a.__proto__.constructor == Function
)是真的。