Javascript前端開發:阿里JS面試題讓你深入瞭解原型與繼承

題目如下:

var F = function(){}
Object.prototype.a = function(){
console.log('a()')
}
Function.prototype.b = function(){
console.log('b()')
}
var f = new F()
F.a()
F.b()
f.a()
f.b()

主要考查的技術點:

1.、原型與原型鏈

2、實例對象、構造函數、Object、 Function的關係

分析:

F是個構造函數,而f是構造函數F的一個實例。

因爲F instanceof Object == true、F instanceof Function == true

由此我們可以得出結論:F是Object 和 Function兩個的實例,即F既能訪問到a,也能訪問到b。

所以F.a() 輸出 a() F.b() 輸出 b()

對於f,我們先來看下下面的結果:

f並不是Function的實例,因爲它本來就不是構造函數,所以就調用Function原型鏈上的相關屬性和方法了,只能訪問Object原型鏈。

所以f.a() 輸出 a() 而f.b()就報錯了。

接下來,我們具體分析下,它們是如何按路徑查找的:

f.a的查找路徑: f自身: 沒有 ---> f.__proto__(Object.prototype): 輸出a()

f.b的查找路徑: f自身: 沒有 ---> f.__proto__(Object.prototype): 沒有 ---> f.__proto__.__proto__ (Object.prototype.__proto__): 因爲找不到,所以報錯

F.a的查找路徑: F自身: 沒有 ---> F.__proto__(Function.prototype): 沒有 ---> F.__proto__.__proto__(Object.prototype): 輸出 a()

F.b的查找路徑: F自身: 沒有 ---> F.__proto__(Function.prototype): b()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章