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