JS原型prototype和__proto__用法例項分析
本文例項講述了JS原型prototype和__proto__用法。分享給大家供大家參考,具體如下:
先來看一個例項
function Foo() { } var foo = new Foo(); console.log(foo.prototype);// undefined console.log(foo.__proto__ === Foo.prototype);// true console.log(Foo.__proto__); [Function]
Foo.__proto__結果如下:
console.log(Foo.prototype);// [object Object]
Foo.prototype結果如下:
console.log(Foo.prototype.prototype);// undefined
例項說明了:
1、 foo 是 Foo 的一個例項,不是一個函式,所以沒有prototype;
Foo是Function的一個例項,而Function是一個函式,他的例項Foo也是一個函式,所以他們都有prototype。此外Object Array RegExp等也是函式。Math就僅僅是一個new Object(),不是函式。
2、建構函式的prototype,預設情況下就是一個new Object()還額外添加了一個constructor屬性。所以說預設是沒有prototype只有__proto__的。
除了Object.prototype這個物件,其他所有的物件都會有__proto__屬性,之後函式才會有prototype屬性。
在建立物件的時候會自動建立一個__proto__屬性,指向它建構函式的prototype,當訪問這個物件的屬性的時候會順帶訪問__proto__中對應的屬性,也就是建構函式prototype這樣實現了繼承。
只有建立函式的時候才會建立一個prototype屬性,目的就是為了完成上面的繼承方式。
總結:
<1>不管是普通物件還是函式物件,它們都有一個隱含屬性”__proto__ “,而這屬性就是我們通常說的原型(屬性),它其實就是一個Object型別的物件。
<2>對於函式物件,它們還會多一個prototype的屬性,它和以它為建構函式建立的普通物件的”__proto__ “屬性等同,即"new XXXt().__proto__ ===XXX.prototype"為true,即物件XXX中都有__proto__屬性就是一個指標,指向XXX建構函式中的prototype屬性。
摘錄網上
一個圖(橙色箭頭是初始的關係,綠色是執行 var Fish = new Fu... 建立,藍色是執行f1= new Fish()建立。)
這樣f1 就可以通過__proto__ 訪問 Fish.prototype中的屬性(當然這是程式執行的時候自動查詢的)。Fish就可以訪問 Function.prototype定義的屬性。所有物件都可以訪問Object.prototype 中的屬性。
感興趣的朋友可以使用線上HTML/CSS/JavaScript程式碼執行工具:http://tools.jb51.net/code/HtmlJsRun測試上述程式碼執行效果。
更多關於JavaScript相關內容感興趣的讀者可檢視本站專題:《javascript面向物件入門教程》、《JavaScript錯誤與除錯技巧總結》、《JavaScript資料結構與演算法技巧總結》、《JavaScript遍歷演算法與技巧總結》及《JavaScript數學運算用法總結》
希望本文所述對大家JavaScript程式設計有所幫助。