關於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設置為即是一個以對象字面量情勢建立的新對象時,constructor屬性不再指向該組織函數。

3 回歸問題

該問題就是有了 對A的prototype的從新設置,致使A.prototype 不在指向A的組織函數。所以上眼前兩個都返回false。而constructor 是繼續自prototype ,所以hasOwnProperty(‘constructor’) 是false.
假如A.prototype從新賦值后願望constructor仍指向A的話,我們能夠在字面對象里加一個constructor屬性讓它指向A。

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, 你答對了嗎?

    原文作者:小蔥
    原文地址: https://segmentfault.com/a/1190000014769147
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞