更多内容,请访问:JavaScript-原型及原型链相关总结
constructor伴随着函数产生的,当创建一个函数时,会默认为函数创建一个prototype对象(原型对象)。在prototype对象里,也会默认添加两个属性,__proto__和constructor。
__proto__是形成原型链的重要原因,如果想要了解原型链,请进入JavaScript--原型链。constructor属性是指向构造函数本身的。
比如: function A() { }
A.prototype.constructor === A
接下来,我将通过一个实例对象,来写成一系列相关的constructor,这里你需要去进入JavaScript--原型链中去了解原型链。
let a = new A()
(注:通过构造函数new一个实例对象,new的过程中,发生了:新创建一个空对象{},将this指向这个对象,执行构造函数内容,返回这个对象)
通过原型链,我们很容易清楚的知道以下关于constructor等式成立(我将会尽量列举所有constructor,某些会写有注释):
一、实例对象a
a.__proto__.constructor === A
a.constructor === A (注:a.__proto__是指向A的prototype,而A.prototype中有一个constructor属性是指向A的,所以a.constructor访问的是A)
a.__proto__.__proto__.constructor === Object (注:a.__proto__ === A.prototype,A.prototype.__proto__ === Object.prototype,而Object.prototype.constructor === Object,即a.__proto__.__proto__.constructor === Object)
注意:如果你要a.__proto__.__proto__.__proto__.constructor,那么会报一个错误“Uncaught TypeError: Cannot read property 'constructor' of null”,因为a.__proto__.__proto__ === Object.prototype,Object.prototype.__proto__ === null,即a.__proto__.__proto__.__proto__ === null,null是没有constructor属性的。
二、A
A.prototype.constructor === A
A.prototype.__proto__.constructor === Object (注:A.prototype.__proto__ === Object.prototype,Object.prototype.constructor === Object,则A.prototype.__proto__.constructor === Object)
A.__proto__.constructor === Function(A.__proto__ === Function.prototype,Function.prototype.constructor === Function,即A.__proto__.constructor === Function)
A.constructor === Function
A.__proto__.__proto__.constructor === Object(注:A.__proto__.__proto__ === Object.prototype,Object.prototype.constructor === Object,即A.__proto__.__proto__.constructor === Object)
注意:如果你要A.__proto__.__proto__.__proto__.constructor,那么会报一个错误“Uncaught TypeError: Cannot read property 'constructor' of null”,因为A.__proto__.__proto__ === Object.prototype,Object.prototype.__proto__ === null,即A.__proto__.__proto__.__proto__ === null,null是没有constructor属性的。
三、Object
Object.constructor === Function (注:Object.__proto__ === Function.prototype,Function.prototype.constructor ===Function,即Object.constructor === Function)
Object.__proto__.constructor === Function (注:原因如上所示)
Object.prototype.constructor === Object
Object.__proto__.__proto__.constructor === Object (注:Object.__proto__.__proto__ === Function.prototype.__proto__,Function.prototype.__proto__ === Object.prototype,Object.prototype.constructor === Object,即Object.__proto__.__proto__.constructor === Object)
注意:如果你要Object.__proto__.__proto__.__proto__.constructor,那么会报一个错误“Uncaught TypeError: Cannot read property 'constructor' of null”,因为Object.__proto__.__proto__.__proto === Function.prototype.__proto__.__proto__,Function.prototype.__proto__.__proto__ === Object.prototype.__proto__ === null,null是没有constructor属性的。
为什么没有Object.prototype.__proto__.constructor呢,因为Object.prototype.__proto__ === null,null是没有constructor属性的。Object.prototype.__proto__.constructor也会报一个错误“Uncaught TypeError: Cannot read property 'constructor' of null”。
四、Function
Function.prototype.constructor === Function
Function.__proto__.constructor === Function (注:Function.__proto__ === Function.prototype,Function.prototype.constructor === Function)
Function.__proto__.__proto__.constructor === Object (注:Function.__proto__ === Function.prototype,Function.prototype.__proto__ === Object.prototype,Object.prototype.constructor === Object)
注意:如果你要Function.__proto__.__proto__.__proto__.constructor,那么会报一个错误“Uncaught TypeError: Cannot read property 'constructor' of null”,因为Function.__proto__.__proto__.__proto === Function.prototype.__proto__.__proto__,Function.prototype.__proto__.__proto__ === Object.prototype.__proto__ ,Object.prototype.__proto__ === null,null是没有constructor属性的。
Function.prototype.__proto__.constructor === Object
注意:如果你要Function.prototype.__proto__.__proto__.constructor,那么会报一个错误“Uncaught TypeError: Cannot read property 'constructor' of null”,因为Function.prototype.__proto__.__proto === Object.prototype.__proto__,Object.prototype.__proto__=== null,null是没有constructor属性的。