基于JavaScript實(shí)現(xiàn)繼承機(jī)制之原型鏈(prototype chaining)的詳解
如果用原型方式重定義前面例子中的類,它們將變?yōu)橄铝行问剑?BR>
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() 方法的代碼如下:
function ClassB() {
}
ClassB.prototype = new ClassA();
ClassB.prototype.name = "";
ClassB.prototype.sayName = function () {
alert(this.name);
};
可通過運(yùn)行下面的例子測試這段代碼:
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。例如:
var objB = new ClassB();
alert(objB instanceof ClassA); //輸出 "true"
alert(objB instanceof ClassB); //輸出 "true"
在 ECMAScript 的弱類型世界中,這是極其有用的工具,不過使用對(duì)象冒充時(shí)不能使用該方法判斷。但是由于子類的原型被直接重新賦值,所以出現(xiàn)以下這種情況:
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)文章
利用Query+bootstrap和js兩種方式實(shí)現(xiàn)日期選擇器
日期選擇器在我們平時(shí)開發(fā)的時(shí)候經(jīng)常要用到,下面這篇文章主要給大家介紹了利用Query+bootstrap和js這兩種方式實(shí)現(xiàn)日期選擇器的方法,文中兩種方法都給出了詳細(xì)的示例代碼,有需要的朋友可以參考借鑒,下面來一起看看吧。2017-01-01
兼容IE,firefox的獲取節(jié)點(diǎn)的文本值的javascript代碼
javascript獲取節(jié)點(diǎn)的文本值,已經(jīng)考慮了兼容性。大家可以放心使用。注意了這里的兼容沒有使用innerText,如果要使用兼容innerText,請(qǐng)參考腳本之家以前發(fā)布的文章。2009-12-12
JavaScript DOM 編程藝術(shù)(第2版)讀書筆記(JavaScript的最佳實(shí)踐)
閱讀了本書第五章關(guān)于使用JavaScript的最佳實(shí)踐,大部分的建議之前都有耳聞,不過閱讀之后有更深的體會(huì)2013-10-10
Javascript中String的常用方法實(shí)例分析
這篇文章主要介紹了Javascript中String的常用方法,實(shí)例分析了String常用的字符轉(zhuǎn)換、截取、分割等技巧,需要的朋友可以參考下2015-06-06
js學(xué)習(xí)總結(jié)_基于數(shù)據(jù)類型檢測的四種方式(必看)
下面小編就為大家?guī)硪黄猨s學(xué)習(xí)總結(jié)_基于數(shù)據(jù)類型檢測的四種方式(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07
JavaScript 異步調(diào)用框架 (Part 2 - 用例設(shè)計(jì))
在上一篇文章里說到,我們要設(shè)計(jì)一個(gè)異步調(diào)用框架,最好能夠統(tǒng)一同步異步調(diào)用的接口,同時(shí)具體調(diào)用順序與實(shí)現(xiàn)方式無關(guān)。那么我們現(xiàn)在就來設(shè)計(jì)這樣一個(gè)框架的用例。2009-08-08
js獲取多個(gè)tagname的節(jié)點(diǎn)數(shù)組
寫了個(gè)獲取多個(gè)tagname節(jié)點(diǎn)集合的小方法。類似于jQuery的$(‘iput,select,textarea’,'#form’)的效果,返回是按節(jié)點(diǎn)在原有文檔流中的順序返回的2013-09-09

