深入理解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 === FunctionA.__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属性的。

目录

相关推荐
深入理解对象原型__proto__对象的isPrototypeOf和静态方法Object.getPrototypeOf深入理解原型链JavaScript--原型链图解Object对象中的静态方法setPrototypeOf