前言
讓你感受不一樣的原型鏈
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)常看看圖亚侠,很容易就深入腦海了曹体。