一、什么是原型鏈
原型鏈是javascript中用來實現(xiàn)類似類繼承的一套機制狼讨。像鏈條一樣把javascript中的對象連接起來面徽,實現(xiàn)類似子聯(lián)系父的現(xiàn)象。
二复罐、原型鏈的實現(xiàn)
總的來說沿侈,就是:
- 對象的__proto__指向其構造器的prototype對象,然后該prototype對象的__proto__指向Function的prototype對象市栗,最后該prototype對象的__proto__指向Object的prototype對象缀拭。
- 對象的prototype對象中的constructor屬性指向其構造器對象咳短,不過constructor屬性一般沒什么用,不需要考慮蛛淋。
實際上原型鏈是通過__proto__來實現(xiàn)的咙好,因為__proto__一直指向的都是prototype對象,給人的感覺就是順著prototype對象查找的
忽略__proto__褐荷,那么原型鏈的查找順序鏈有兩條勾效,分別是:
對象——構造器原型對象——Object原型對象
構造器(函數(shù))對象——Function原型對象——Object原型對象
三、一些測試
-
對象真的沒有prototype屬性叛甫?
未命名文件.jpg
Object對象除外
-
對象的__proto__指向構造器的prototype對象层宫?
未命名文件.jpg - 構造器的prototype對象的__proto__指向Object的prototype對象?
即使特殊如Function和Object對象也是如此,Object的構造器是Function
-
函數(shù)(構造器)對象的__proto__指向Function的prototype對象其监?
未命名文件.jpg
其實萌腿,也就是對象__proto__指向構造器的prototype對象
-
Function對象的__proto__指向其prototype對象?
1.JPG
Function的構造器指向其prototype對象抖苦,是比較特殊的毁菱,那么是不是意味著它的構造器是其本身,這個不太清楚
四锌历、一些解釋
- 擴充函數(shù)
Function.prototype.method = function(){}
上面擴充的method函數(shù)對象(包括全局對象瀏覽器中為window對象)并不能訪問到贮庞,而函數(shù)可以訪問到。這是因為對象的原型鏈不經(jīng)過Function.prototype究西,而函數(shù)經(jīng)過窗慎。而Object.prototype.method=function(){}不管函數(shù)還是對象都可以訪問。
- 擴充函數(shù)的改進
Function.prototype.method = function(name, func){
if(!this.prototype[name]){
this.prototype[name] = func;
}
return this;
}
Array.method('method', function(){
// some code here
});
上面代碼通過給Function的原型對象添加一個method方法卤材,用于給各函數(shù)(構造器)添加原型方法捉邢。
Array.method(‘arrayMethod’,function(){});就是給Array的原型對象添加了arrayMethod方法,那么Array構造的對象就可以訪問到這個方法商膊。不過伏伐,使用Array.arrayMethod就不能訪問這個方法。