1. 程式人生 > 程式設計 >JS原型prototype和__proto__用法例項分析

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__結果如下:

JS原型prototype和__proto__用法例項分析

console.log(Foo.prototype);// [object Object]

Foo.prototype結果如下:

JS原型prototype和__proto__用法例項分析

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()建立。)

JS原型prototype和__proto__用法例項分析

這樣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程式設計有所幫助。