咱們先看一道題目瀏覽器
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();
複製代碼
__proto__
是原型鏈的連接bash
經過 __proto__
查找到prototype
, prototype
是原型的關鍵字網絡
var f = new F()
f: 是實例對象
F: 是構造函數
f經過__proto__
找到F.prototype
,因此f.__proto__ === F.prototype
函數
構造器的原型屬於對象 Object ,也就是說 F.prototype
是 new object
出來的。因此 F.prototype
經過 __proto__
能夠找到 Object.prototype
即:F.prototype.__proto__ === Object.Prototype
post
function Function()
是函數構造器
Function.__proto__ === Function.prototype
Function.prototype
是對象,因此Function.prototype.__proto__ === Object.prototype
spa
終極:Objecy.prototype.__proto__ === null
prototype
再回過頭來看上面的題目code
f.a()
,f 是實例對象, f沒有a屬性,經過f.__proto__
找到原型F.prototype
,F.prototype
上也沒有a屬性,繼續經過 F.prototype.__proto__
找到Object.prototype
,發現a屬性,因此輸出af.b()
,同理找到 Object.prototype
,發現Object.prototype
也沒有b屬性,繼續經過__proto__
查找 到了null,因此b函數不存在,瀏覽器報錯。 則 F.a(),F.b()也不會執行f.b()
,執行F.a()
。F是函數,F上沒有a屬性,經過__proto__
找到Function.prototype
,發現Function.prototype
沒有a屬性,繼續經過__proto__
,找到Object.prototype
,找到了a屬性,輸出af.b()
,執行F.b()
。同理找到Function.prototype
,發現b屬性,輸出bJS 原型與原型鏈cdn
若是有理解不對的地方,歡迎大佬指正!對象