深入了解constructor

更多内容,请访问: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 === 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属性的。

三、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属性的。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值