前言
讓你感受不一樣的原型鏈
Function.prototype.a = 1;
Object.prototype.b = 2;
function A() {}
var a = new A();
console.log(A.a, A.b);
console.log(a.a, a.b);
console.log(Function.b, Object.a);
上述輸出什么?
答案:
console.log(A.a, A.b); // 1 2
console.log(a.a, a.b); // undefined 2
console.log(Function.b, Object.a); // 2 1
原因:
普及一下九大內(nèi)置對象:
String、Number、Boolean 、Object、Function、Array、Date、RegExp、Error,同時也是內(nèi)置函數(shù),內(nèi)置函數(shù)本身是Function作為構(gòu)造器調(diào)用生成的實例對象。
1) ECMAScript規(guī)定了兩個特殊的內(nèi)置對象:Object和Function,他們的特殊性在于,他們本身是函數(shù)對象,而他們同時也是構(gòu)造函數(shù)。(函數(shù)對象對應(yīng)的類型是Function,正如數(shù)組對象對應(yīng)的類型是Array;正常的構(gòu)造函數(shù),就是new Fn()。 )
- 因為構(gòu)造函數(shù)是
Function是實例對象,所以Object是Function的實例對象。- 因為
Object是所有對象的基類,所以Function.prototype是Object的實例對象。
2)原型鏈?zhǔn)菍ο蟮募?,每個對象都有內(nèi)部屬性[[Prototype]](__proto__指針)指向另一個對象;當(dāng)訪問對象某一屬性的時候,如果此屬性不在此對象的自身屬性上,則繼續(xù)去[[Prototype]]指向的對象上查找此屬性。[[Prototype]]形成的對象的鏈?zhǔn)郊霞丛玩?。這里可以得出:原型鏈上的所有元素都是對象。
而實例對象就會在自身找不到時會往[[Prototype]]指向的對象上查找。
3)ECMASciprt規(guī)定:原型鏈上有兩個元素是固定的,終點是null,倒數(shù)第二的元素是Object.prototype指向的對象。
原型鏈上排行倒數(shù)第三的有這幾種情況:
?1. 字面量{}和new Object()
?2.Math
?3.JSON
?4. 除Object之外的內(nèi)置函數(shù)的prototype屬性指向的對象(8個)原型鏈上排行倒數(shù)第三的有這幾種情況:
?1. 除Object之外的內(nèi)置函數(shù)的實例對象(8個)
?2. 內(nèi)置函數(shù)(9個)
說那么多,不如一張圖來的方便: (轉(zhuǎn)載圖片請@我,謝謝)

我們最常用的就是 字面量{}和function;上述題目中
Function.prototype.a = 1;
Object.prototype.b = 2;
function A() {}
var a = new A();
console.log(A.a, A.b); // 1 2
console.log(a.a, a.b); // undefined 2
console.log(Function.b, Object.a); // 2 1
1、function A() {}在原型鏈的倒數(shù)第四(方塊function),按照原型鏈查找規(guī)則,所以它可以拿到Function.prototype和Object.prototype。
2、var a = new A();,其實a就是一個對象,我們看下這句話的原理是什么:
var obj = { __proto__: F.prototype }; /*第一步*/
return function() {
F.apply(obj, arguments); /*第二步*/
return obj; /*第三步*/
};
}
用法:
var a = New(A)('小米');
你可以看到調(diào)用New(A)('小米')實際return的是obj,obj就是一個對象。
所以此時原型鏈在倒數(shù)第三處,往上找只有Object.prototype。
3、Function.b和Object.a中的 Function和Object是九個內(nèi)置對象中的,所以它可以找到Function.prototype和Object.prototype。
一張圖是不是解決了多年的困擾,曾經(jīng)記了太多文字,沒多久就忘,經(jīng)常看看圖,很容易就深入腦海了。