深入理解constructor
2023-11-24 13:33:49一、定义
constructor伴随着函数产生的,当创建一个函数时,会默认为函数创建一个prototype对象(原型对象)。在prototype对象里,也会默认添加两个属性,__proto__和constructor。
__proto__是形成原型链的重要原因,如果想要了解__proto__,请进入JavaScript--深入理解__proto__。constructor属性是指向构造函数本身的。
二、举例
比如: function A() { }
A.prototype.constructor === A
接下来,我将通过一个实例对象,来写成一系列相关的constructor,这里你需要去进入JavaScript--深入理解__proto__中去了解__proto__。
let a = new A()
注:通过构造函数new一个实例对象,new的过程中,发生了:新创建一个空对象{},将this指向这个对象,执行构造函数内容,返回这个对象
通过原型链,我们很容易清楚的知道以下关于constructor等式成立(我将会尽量列举所有constructor,某些会写有注释):
1. 实例对象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属性的。
2. 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属性的。
3. 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”。
4. 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属性的。