亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于JavaScript實(shí)現(xiàn)繼承機(jī)制之原型鏈(prototype chaining)的詳解

 更新時(shí)間:2013年05月07日 16:49:08   作者:  
我們知道在JavaScript中定義類的原型方式,而原型鏈擴(kuò)展了這種方式,以一種有趣的方式實(shí)現(xiàn)繼承機(jī)制。prototype 對(duì)象是個(gè)模板,要實(shí)例化的對(duì)象都以這個(gè)模板為基礎(chǔ)。總而言之,prototype 對(duì)象的任何屬性和方法都被傳遞給那個(gè)類的所有實(shí)例。原型鏈利用這種功能來(lái)實(shí)現(xiàn)繼承機(jī)制

如果用原型方式重定義前面例子中的類,它們將變?yōu)橄铝行问剑?BR>

復(fù)制代碼 代碼如下:

function ClassA() {
}

ClassA.prototype.color = "blue";
ClassA.prototype.sayColor = function () {
    alert(this.color);
};

function ClassB() {
}

ClassB.prototype = new ClassA();


原型方式的神奇之處在于最后一行代碼。這里,把 ClassB 的 prototype 屬性設(shè)置成 ClassA 的實(shí)例。這很有意思,因?yàn)橄胍?ClassA 的所有屬性和方法,但又不想逐個(gè)將它們 添加到ClassB 的 prototype 屬性。還有比把 ClassA 的實(shí)例賦予 prototype 屬性更好的方法嗎?

注意:調(diào)用 ClassA 的構(gòu)造函數(shù),沒有給它傳遞參數(shù)。這在原型鏈中是標(biāo)準(zhǔn)做法。要確保構(gòu)造函數(shù)沒有任何參數(shù)。

與對(duì)象冒充相似,子類的所有屬性和方法都必須出現(xiàn)在 prototype 屬性被賦值后,因?yàn)樵谒百x值的所有方法都會(huì)被刪除。為什么?因?yàn)?prototype 屬性被替換成了新對(duì)象,添加了新方法的原始對(duì)象將被銷毀。所以,為 ClassB 類添加 name 屬性和 sayName() 方法的代碼如下:

復(fù)制代碼 代碼如下:

function ClassB() {
}

ClassB.prototype = new ClassA();

ClassB.prototype.name = "";
ClassB.prototype.sayName = function () {
    alert(this.name);
};


可通過(guò)運(yùn)行下面的例子測(cè)試這段代碼:
復(fù)制代碼 代碼如下:

var objA = new ClassA();
var objB = new ClassB();
objA.color = "blue";
objB.color = "red";
objB.name = "John";
objA.sayColor();
objB.sayColor();
objB.sayName();

此外,在原型鏈中,instanceof 運(yùn)算符的運(yùn)行方式也很獨(dú)特。對(duì) ClassB 的所有實(shí)例,instanceof 為 ClassA 和 ClassB 都返回 true。例如:
復(fù)制代碼 代碼如下:

var objB = new ClassB();
alert(objB instanceof ClassA);    //輸出 "true"
alert(objB instanceof ClassB);    //輸出 "true"

在 ECMAScript 的弱類型世界中,這是極其有用的工具,不過(guò)使用對(duì)象冒充時(shí)不能使用該方法判斷。但是由于子類的原型被直接重新賦值,所以出現(xiàn)以下這種情況:
復(fù)制代碼 代碼如下:

console.log(objB.__proto__===objB.constructor.prototype)   //false

因?yàn)镃lassB的原型鏈 prototype 屬性被另一個(gè)類的對(duì)象重寫了。輸出結(jié)果可以看出objB.__proto__仍然指向的是ClassB.prototype,而不是objB.constructor.prototype。這也很好理解,給Person.prototype賦值的是一個(gè)對(duì)象直接量new ClassA()實(shí)例,使用對(duì)象直接量方式定義的對(duì)象其構(gòu)造器(constructor)指向的是根構(gòu)造器Object,Object.prototype是一個(gè)空對(duì)象{},{}自然與ClassB.prototype不等。

相關(guān)文章

最新評(píng)論