我是Javascript的新手,我正在努力深入挖掘和理解继承、构造函数和原型链。因此,我创建了一个构造函数,
var a = function(){this.integer=1,this.float=1.0,this.string="one"}现在,这个函数有一个prototype.constructor属性、一个构造函数属性和一个__proto__.constructor属性。
我知道__proto__.constructor是为创建函数a而执行的构造函数。此外,prototype.constructor是当我使用==关键字创建'a‘的实例时执行的函数。
然而,我不明白第三个构造函数属性是用来做什么的。它等于__proto__.constructor。
还有,b.__proto__.constructor !== Object.prototype.constructor,正如我所想的那样。为什么会这样呢?
发布于 2019-02-20 04:13:46
a.__proto__是Function的原型(即Function.prototype)。它是一个对象,所有函数都从该对象继承特定于函数的方法,如call、apply、bind等。
a.__proto__.constructor是Function构造函数,即Function函数。Function原型通过constructor属性具有对其关联构造函数的引用,这始终是原型对象和构造函数之间的默认关系。(在接下来的两段中将更多地介绍这种“默认关系”。)
完全不同的是a.prototype --在JavaScript中,任何函数都可以是一个构造函数,即可以用new调用它。每当使用new调用函数时,它都会创建一个新对象,该对象的__proto__是该函数的prototype,并通过this指向新创建的对象。因此,在对new a()的调用中,this.__proto__等于a.prototype是真的。这个原型对象是在定义函数a时自动创建并存储在a.prototype中的。
a.prototype.constructor等同于a,因为为新定义的函数(如上一段所述)创建prototype对象的JavaScript内部例程总是为新原型提供一个引用新定义的函数的constructor属性。为了深入了解实际情况,相关的ECMAScript例程是19.2.1.1.1, CreateDynamicFunction,它指出:“对于使用CreateDynamicFunction创建的每个函数,都会自动创建一个prototype属性,以提供将该函数用作构造函数的可能性。”
a没有自己的constructor属性,但它会自动继承可作为a.constructor访问的a.__proto__.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)是正确的。
https://stackoverflow.com/questions/54774046
复制相似问题