JS constructor探讨(一) 为什么要设置prototype constructor

首先给大家分享一个巨牛巨牛的人工智能教程,是我无意中发现的。教程不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈~我正在学习中,觉得太牛了,所以分享给大家!点这里可以跳转到教程

                    

每次实现JS的继承时,代码里必有如下两句:

//  用于设置原型Employee.prototype = new Person()//  设置原型的构造器Employee.prototype.constructor=Employee
  
  
  • 1
  • 2
  • 3
  • 4

实现原型链就靠第一句话,但第二句话有什么用呢?

先看示例代码:

function Person(username) {    this.username = username;}Person.prototype.setUsername = function(name) {    this.username = name;}//  继承Personfunction Employee(username, company) {    Person.call(this, username);    this.company = company;}//  设置原型Employee.prototype = new Person()Employee.prototype.constructor=Employee//  测试代码var yiifaa = new Employee('yiifaa', '360')
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

1. 会影响原型链吗?

其实可以很容易反证,如果影响原型链的话,constructor应该设置为Person才对,否则不就形成死循环了吗?

//  显然,prototype与constructor已经形成了双向联系//  结果恒为真Employee.prototype.constructor.prototype.constructor === Employee
  
  
  • 1
  • 2
  • 3

建立原型链主要靠proto属性,如下:

//  显然,通过__proto__可以链接到原型的顶端//  结果恒为真Employee.prototype.__proto__ === Person.prototypePerson.prototype.__proto__ == Object.prototype
  
  
  • 1
  • 2
  • 3
  • 4

于是

//  一直获取到原型链的顶端Employee.prototype.__proto__.__proto__  === Object.prototype
  
  
  • 1
  • 2

由上面的代码可以看出,constructor对原型链毫无影响。

2. 会影响instanceof吗?

经过测试,无论有没有设置prototype.constructor,以下恒为真

yiifaa instanceof Employeeyiifaa instanceof Person
  
  
  • 1
  • 2

所以对instanceof毫无影响,那好问题来了,如何改变instanceof的结果呢?方法如下:

Person.prototype = {}//  现在为falseyiifaa instanceof Person
  
  
  • 1
  • 2
  • 3

为什么呢?因为现在原型链的链已经断了,证明如下:

Employee.prototype.__proto__ !== Person.prototype
  
  
  • 1

那怎么改回来呢?

Person.prototype = Employee.prototype.__proto__//  现在测试恒为真yiifaa instanceof Person
  
  
  • 1
  • 2
  • 3

3. 会影响ownProperty吗?

显然,ownProperty只取决于构造函数,而不是构造函数的属性。

5. 最佳应用场景

于是constructor的最佳应用场景为类型判断,如下:

var arr = []//  恒为真arr.constructor === Arrayvar num = 2//  恒为真num.constructor === Numbervar str = '123'//  恒为真str.constructor === String
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

6. 结论

prototype.constructor仅仅可以用于识别对象是由哪个构造函数初始化的,仅此而已。

           

浏览人工智能教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值