关于constructor 的理解

1 面试题再现

面试时遇到下面一段代码:面试

function A () {}
  function B () {}
  A.prototype = {
    fun: function () {}
  }
  var a =new A ()

  console.log(a.constructor === A)
  console.log(A.prototype.constructor === A)
  console.log(a.hasOwnProperty('constructor'))

你们猜到上面的结果是啥了吗?正确答案是 false false false函数

2 constructor原理

咱们建立的每一个函数都有一个prototype(原型)对象,这个属性是一个指针,指向一个对象。在默认状况下,全部原型对象都会自动得到一个constructor(构造函数)属性,这个属性是一个指向prototype属性所在函数的指针。当调用构造函数建立一个新实例后,该实例的内部将包含一个指针(继承自构造函数的prototype),指向构造函数的原型对象。prototype

但有一点咱们是要注意的,当咱们将构造函数的prototype设置为等于一个以对象字面量形式建立的新对象时,constructor属性再也不指向该构造函数。指针

3 回归题目

该题目就是有了 对A的prototype的从新设置,致使A.prototype 不在指向A的构造函数。因此上面前两个都返回false。而constructor 是继承自prototype ,因此hasOwnProperty('constructor') 是false.
若是A.prototype从新赋值后但愿constructor仍指向A的话,咱们能够在字面对象里加一个constructor属性让它指向A。code

A.prototype = {
    fun: function () {},
    constructor: A
}

这样就能够返回true了对象

4 进阶题目

A.prototype = new B()
 var b = new A()
 console.log(b.constructor === A)
 console.log(B.prototype.constructor === A)
 console.log(b.constructor.prototype.constructor === A)
 console.log(b.hasOwnProperty('constructor'))

上面的都是返回false, 你答对了吗?继承

相关文章
相关标签/搜索