- 相關(guān)推薦
JavaScript中的原型鏈prototype詳解
JavaScript中的繼承是通過(guò)原型鏈(prototype chain)來(lái)完成的:每個(gè)對象內部都有另外一個(gè)對象作為其prototype而存在,對象從這個(gè)prototype中繼承屬性(property)。對于每個(gè)對象來(lái)說(shuō),可以用以下三種方式來(lái)訪(fǎng)問(wèn)其原型對象:
1.__proto__。可以通過(guò)對象的__proto__屬性來(lái)訪(fǎng)問(wèn)其原型對象。該屬性?xún)H在Firefox、Safari和Chrome中得到支持,在IE和Opera中不支持。
2.Object.getPrototypeOf()。可以將對象作為參數傳入Object.getPrototypeOf()方法,執行后即返回對象的原型對象。此方法僅在ECMAScript 5標準中得到支持。
3.o.constructor.prototype。通過(guò)先獲取對象的constructor函數,然后再通過(guò)訪(fǎng)問(wèn)constructor函數的prototype屬性來(lái)訪(fǎng)問(wèn)到原型對象。使用此方法的前提為:對象中存在指向構造函數的constructor屬性。
判斷兩個(gè)對象間是否存在原型鏈關(guān)系可以使用isPrototype()方法:
復制代碼 代碼如下:
var p = {x:1};
var o = Object.create(p);
console.log(p.isPrototypeOf(o));//true
對于所有用字面量創(chuàng )建的對象而言,其prototype對象均為Object.prototype(作為一個(gè)特殊對象,Object.prototype沒(méi)有原型對象):
復制代碼 代碼如下:
var x = {a:18, b:28};
console.log(x.__proto__);//Object {}
而對于所有用new操作符創(chuàng )建的對象而言,其prototype對象均為constructor函數的prototype屬性:
復制代碼 代碼如下:
var x = {a:18, b:28};
function Test(c){
this.c = c;
}
Test.prototype = x;
var t = new Test(38);
console.log(t);//Object {c=38, a=18, b=28}
console.log(t.__proto__);//Object {a=18, b=28}
console.log(t.__proto__.__proto__);//Object {}
JavaScript中使用new操作符創(chuàng )建對象的過(guò)程如下:
1.創(chuàng )建一個(gè)新的空對象。
2.將這個(gè)對象的__proto__屬性指向constructor函數的prototype屬性。
3.將這個(gè)對象作為this參數,執行constructor函數。
從上述創(chuàng )建過(guò)程可以得出結論:所有從同一個(gè)constructor函數中構造出來(lái)的對象,其__proto__屬性(也即其原型對象)相等,也就是說(shuō),只存在一個(gè)原型對象:
復制代碼 代碼如下:
var t = new Test(38);
var t2 = new Test(68);
console.log(t === t2);//false
console.log(t.__proto__ === t2.__proto__);//true
【JavaScript中的原型鏈prototype詳解】相關(guān)文章:
理解JavaScript原型鏈教程09-02
JavaScript中push(),join() 函數實(shí)例詳解09-05
詳解JavaScript中的splice()使用方法08-20
Javascript中arguments對象的詳解和使用方法08-20
詳解SEO外鏈本質(zhì)10-24
JavaScript類(lèi)定義原型方法的兩種實(shí)現的區別07-11
JavaScript中的with關(guān)鍵字07-24
在Java中執行JavaScript代碼07-14