題目如下:
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()