javascript面向?qū)ο笾甁avascript 繼承
上幾節(jié)講了 JavaScript 面向?qū)ο笾臻g 、 javascript 面向?qū)ο蟮腏avaScript類 、 JavaScript 面向?qū)ο蟮闹接谐蓡T和公開成員 與 Javascript 面向?qū)ο笾剌d,大家可以先看上面的再繼續(xù)往下看。
在JavaScript中實現(xiàn)繼承可以有多種方法,下面說兩種常見的。
一,call 繼承,先看代碼:
先定義一個“人”類
//人類
Person=function(){
this.name="草/泥/馬";
this.eat=function(){
alert("我要吃飯");
}
this.sleep=function(){
alert("我要睡覺");
}
}
再定義一個學(xué)生類,讓它繼承于Person
//學(xué)生類
Student=function(){
Person.call(this);//繼承Person類
this.doHomework=function(){
alert("老師來了,作業(yè)借我抄下");
}
}
關(guān)鍵看 Person.call(this)這句,其中this代表當(dāng)前對象,即Student ,這很容易理解,而Person.call(this)的意思是:將Person類的所有的公開成員“附加”給Student類,讓Student也具有了Person的所有功能。
和高級語言一樣,如果子類中出現(xiàn)了和父類中同名的成員,則會將其覆蓋,也就是所謂的“重寫”了。
同樣的,我們再定義一個女孩類 :
//女孩類
Girl=function(){
Person.call(this);//繼承Person類
this.sex="女";
}
JavaScript是可以實現(xiàn)多重繼承的,請看下面的Master(碩士)類,這個Master 自然是個學(xué)生,但同時又是個漂亮MM,于是有了下面的代碼:
//碩士類
Master=function(){
Student.call(this);//繼承Student類
Girl.call(this);//繼承Girl類
this.degree="碩士";//學(xué)歷
}
我們可以測試一下:
var master=new Master();
master.name="鳳姐";
master.eat();
master.doHomework();
alert("偶是名字叫:"+master.name);
alert("偶的性別是:"+master.sex);
多重繼承時要注意順序,如果兩個類中有相同名稱的成員,那么后一個將覆蓋前一個,也就是說當(dāng)前類只會繼承后一個類中的成員。
call 方法繼承就說到這,如果大家對call方法不清楚,就請去問問谷歌兄,我就不贅述了,網(wǎng)上轉(zhuǎn)載得不要太多。下面說下另外一種繼承方式。
二,prototype 原型繼承:
我們再定義一個班長類:
//班長類
SquadLeader=function (){
//打招呼
this.hi=function(){
alert("同學(xué)們好,我現(xiàn)在是班長了");
}
}
上面定義了一個碩士類,現(xiàn)在這個碩士被提升為班長了,所以這個Master要繼承SquadLeader了,這次我們用prototype 來實現(xiàn),請看下面代碼:
Master.prototype=new SquadLeader();//prototype 屬性指向一個對象
//或者
//Master.prototype=SquadLeader.prototype;
這樣Master就繼承了SquadLeader類,就這么一句話,這里有兩種形式,其實原理是一樣的。意思是:將SquadLeader的“靈魂”拷貝給了Master,于是從此SquadLeader能做的事,Master都可以做了。
測試一下:
var master=new Master();
master.hi()//輸出“同學(xué)們好,我現(xiàn)在是班長了”
我個人比較喜歡用第一種方案(call 繼承)來實現(xiàn)繼承,所有代碼都包在一個“{}”內(nèi),一目了然,在書寫風(fēng)格上較之于第二種更接近于C#。prototype 屬性我一般用來對已有的類做擴(kuò)展。
JavaScript是門非常靈活的語言,實現(xiàn)繼承可能還有其他更好的方式,大家可以去研究挖掘,我在這就當(dāng)是拋了塊磚頭, 希望能引出華美的玉石!
- JavaScript面向?qū)ο笾甈rototypes和繼承
- javascript 面向?qū)ο?實現(xiàn)namespace,class,繼承,重載
- javascript 面向?qū)ο缶幊袒A(chǔ):繼承
- javascript 面向?qū)ο笕吕砭氈^承與多態(tài)
- javascript 面向?qū)ο蠓庋b與繼承
- JS 面向?qū)ο笾^承---多種組合繼承詳解
- JS面向?qū)ο螅?)之Object類,靜態(tài)屬性,閉包,私有屬性, call和apply的使用,繼承的三種實現(xiàn)方法
- javaScript面向?qū)ο罄^承方法經(jīng)典實現(xiàn)
- JS實現(xiàn)面向?qū)ο罄^承的5種方式分析
- JavaScript面向?qū)ο罄^承原理與實現(xiàn)方法分析
相關(guān)文章
javascript面向?qū)ο笕腴T基礎(chǔ)詳細(xì)介紹
本文章介紹了js中常用的對象包括有JavaScript對象簡介 字符串對象 date() 數(shù)組 數(shù)學(xué)對象 函數(shù)對象 應(yīng)用介紹,有需要了解的同學(xué)可參考一下2012-09-09
詳解new function(){}和function(){}() 區(qū)別分析
只要 new 表達(dá)式之后的 constructor 返回(return)一個引用對象(數(shù)組,對象,函數(shù)等),都將覆蓋new創(chuàng)建的匿名對象,如果返回(return)一個原始類型(無 return 時其實為 return 原始類型 undefined),那么就返回 new 創(chuàng)建的匿名對象。2008-03-03
從面試題學(xué)習(xí)Javascript 面向?qū)ο螅▌?chuàng)建對象)
從面試題學(xué)習(xí)Javascript 面向?qū)ο螅▌?chuàng)建對象),學(xué)習(xí)js的朋友可以參考下2012-03-03
學(xué)習(xí)面向?qū)ο笾嫦驅(qū)ο蟮男g(shù)語
學(xué)習(xí)面向?qū)ο笾嫦驅(qū)ο蟮男g(shù)語,學(xué)習(xí)面向?qū)ο笤O(shè)計的朋友可以參考下。2010-11-11
javascript面向?qū)ο缶幊檀a,學(xué)習(xí)js面向?qū)ο缶幊痰呐笥芽梢詤⒖枷隆?/div> 2011-12-12
JavaScript面向?qū)ο笾o態(tài)與非靜態(tài)類
使用JavaScript面向?qū)ο笸耆鲇谂既唬驗榇蟛糠謺r間我都是在無圖形界面的環(huán)境下工作,有時候就算是介入了web客戶端的工作的時候,在寫js和ajax時,最多的也只是寫寫function,從沒有考慮過要使用JavaScript面向?qū)ο筮@么高級的技巧。2010-02-02最新評論

