JavaScript中的原型鏈prototype詳解

JavaScript中的繼承是通過原型鏈(prototype chain)來完成的:每個對象內部都有另外一個對象作爲其prototype而存在,對象從這個prototype中繼承屬性(property)。對於每個對象來說,可以用以下三種方式來訪問其原型對象:

JavaScript中的原型鏈prototype詳解

1.__proto__。可以通過對象的__proto__屬性來訪問其原型對象。該屬性僅在Firefox、Safari和Chrome中得到支持,在IE和Opera中不支持。

rototypeOf()。可以將對象作爲參數傳入rototypeOf()方法,執行後即返回對象的原型對象。此方法僅在ECMAScript 5標準中得到支持。

otype。通過先獲取對象的constructor函數,然後再通過訪問constructor函數的prototype屬性來訪問到原型對象。使用此方法的前提爲:對象中存在指向構造函數的constructor屬性。

判斷兩個對象間是否存在原型鏈關係可以使用isPrototype()方法:

複製代碼 代碼如下:

var p = {x:1};

var o = te(p);

(ototypeOf(o));//true

對於所有用字面量創建的`對象而言,其prototype對象均爲otype(作爲一個特殊對象,otype沒有原型對象):

複製代碼 代碼如下:

var x = {a:18, b:28};

(x.__proto__);//Object {}

而對於所有用new操作符創建的對象而言,其prototype對象均爲constructor函數的prototype屬性:

複製代碼 代碼如下:

var x = {a:18, b:28};

function Test(c){

this.c = c;

}

otype = x;

var t = new Test(38);

(t);//Object {c=38, a=18, b=28}

(t.__proto__);//Object {a=18, b=28}

(t.__proto__.__proto__);//Object {}

JavaScript中使用new操作符創建對象的過程如下:

1.創建一個新的空對象。

2.將這個對象的__proto__屬性指向constructor函數的prototype屬性。

3.將這個對象作爲this參數,執行constructor函數。

從上述創建過程可以得出結論:所有從同一個constructor函數中構造出來的對象,其__proto__屬性(也即其原型對象)相等,也就是說,只存在一個原型對象:

複製代碼 代碼如下:

var t = new Test(38);

var t2 = new Test(68);

(t === t2);//false

(t.__proto__ === t2.__proto__);//true