一直認為原型鏈太過複雜,尤其看過某圖後被繞暈了一整子,今天清理硬碟空間(渣電腦),偶然又看到這圖,勾起了點回憶,於是索性複習一下原型鏈相關的內容,表達能力欠缺邏輯混亂別見怪(為了防止新人__(此處指我)__被在此繞暈,圖片就放在末尾了。) 以下三點需要謹記 1.每個對象都具有一個名為__proto_ ...
一直認為原型鏈太過複雜,尤其看過某圖後被繞暈了一整子,今天清理硬碟空間(渣電腦),偶然又看到這圖,勾起了點回憶,於是索性複習一下原型鏈相關的內容,表達能力欠缺邏輯混亂別見怪(為了防止新人__(此處指我)__被在此繞暈,圖片就放在末尾了。)
以下三點需要謹記
1.每個對象都具有一個名為__proto__的屬性;
2.每個構造函數(構造函數標準為大寫開頭,如Function(),Object()等等JS中自帶的構造函數,以及自己創建的)都具有一個名為prototype的方法(註意:既然是方法,那麼就是一個對象(JS中函數同樣是對象),所以prototype同樣帶有__proto__屬性);
3.每個對象的__proto__屬性指向自身構造函數的prototype;
思路擴展如下
1 function Fun(){ 2 } 3 // 我創造了一個函數Fn 4 // 這個函數由Function生成(Function作為構造函數) 5 var fn=new Fun() 6 // 我創建了一個函數fn 7 // 這個函數由Fn生成(Fn作為構造函數) 8 9 10 console.log(fn.__proto__===Fun.prototype) //true 11 // fn的__proto__指向其構造函數Fun的prototype 12 console.log(Fun.__proto__===Function.prototype) //true 13 // Fun的__proto__指向其構造函數Function的prototype 14 console.log(Function.__proto__===Function.prototype) //true 15 // Function的__proto__指向其構造函數Function的prototype 16 // 構造函數自身是一個函數,他是被自身構造的 17 console.log(Function.prototype.__proto__===Object.prototype) //true 18 // Function.prototype的__proto__指向其構造函數Object的prototype 19 // Function.prototype是一個對象,同樣是一個方法,方法是函數,所以它必須有自己的構造函數也就是Object 20 console.log(Fun.prototype.__proto__===Object.prototype) //true 21 // 與上條相同 22 // 此處可以知道一點,所有構造函數的的prototype方法的__都指向__Object.prototype(除了....Object.prototype自身) 23 console.log(Object.__proto__===Function.prototype) //true 24 // Object作為一個構造函數(是一個函數對象!!函數對象!!),所以他的__proto__指向Function.prototype 25 console.log(Object.prototype.__proto__===null) //true 26 // Object.prototype作為一切的源頭,他的__proto__是null 27 28 // 下麵是一個新的,額外的例子 29 30 var obj={} 31 // 創建了一個obj 32 console.log(obj.__proto__===Object.prototype) //true 33 // obj作為一個直接以字面量創建的對象,所以obj__proto__直接指向了Object.prototype,而不需要經過Function了!! 34 35 // 下麵是根據原型鏈延伸的內容 36 // 還有一個上文並未提到的constructor, constructor在原型鏈中,是作為對象prototypr的一個屬性存在的,它指向構造函數(由於主要講原型鏈,這個就沒在意、); 37 38 console.log(obj.__proto__.__proto__===null) //true 39 console.log(obj.__proto__.constructor===Object) //true 40 console.log(obj.__proto__.constructor.__proto__===Function.prototype) //true 41 console.log(obj.__proto__.constructor.__proto__.__proto__===Object.prototype) //true 42 console.log(obj.__proto__.constructor.__proto__.__proto__.__proto__===null) //true 43 console.log(obj.__proto__.constructor.__proto__.__proto__.constructor.__proto__===Function.prototype) //true 44 45 46 // 以上,有興趣的可以一一驗證 F12搞起.
為了方便記憶可以得出如下結論(如有錯誤歡迎斧正.....)
prototype是構造函數獨有的屬性;
對象的__prototype__屬性通常與其構造函數的prototype屬性相互對應;
所有構造函數的的prototype方法的__都指向__Object.prototype(除了....Object.prototype自身);
需要註意的指向是
Function的__proto__指向其構造函數Function的prototype;
Object作為一個構造函數(是一個函數對象!!函數對象!!),所以他的__proto__指向Function.prototype;
Function.prototype的__proto__指向其構造函數Object的prototype;
Object.prototype的__prototype__指向null(盡頭);
在文章結構順便附送上倆個與原型鏈相關的方法....歡迎使用
1.
hasOwnProperty判斷一個對象是否有名稱的屬性或對象,此方法無法檢查該對象的原型鏈中是否具有該屬性,該屬性必須是對象本身的一個成員。 如果該屬性或者方法是該 對象自身定義的而不是器原型鏈中定義的 則返回true;否則返回false; 格式如下: object.hasOwnProperty(proName);括弧內必須要加引號,並且直接寫入屬性名 2. isPrototypeOf是用來判斷指定對象object1是否存在於另一個對象object2的原型鏈中,是則返回true,否則返回false。 格式如下: object1.isPrototypeOf(object2); object1是一個對象的實例; object2是另一個將要檢查其原型鏈的對象。 原型鏈可以用來在同一個對象類型的不同實例之間共用功能。 如果 object2 的原型鏈中包含object1,那麼 isPrototypeOf 方法返回 true。 如果 object2 不是一個對象或者 object1 沒有出現在 object2 中的原型鏈中,isPrototypeOf 方法將返回 false。
某圖在這裡 ps:本文是總結,加個人理解.....圖是好久前留存在電腦的....忘了是在哪看到的...