js繼承的實(shí)現(xiàn)代碼
更新時(shí)間:2010年08月05日 13:53:23 作者:
學(xué)著js的繼承,自己也寫了個(gè)。感覺不是很好。現(xiàn)在很多代碼都封裝成類。
base.js --繼承的實(shí)現(xiàn)==========================
【注】:繼承后,如果父類是一個(gè)類,則會繼承其屬性,方法(包括用prototype聲明的),靜態(tài)方法,否則只有屬性和方法。
Object.prototype.extendf= function (a,b){
if(!a||!b) return;
var fa = typeof a=="function";
var fb = typeof b=="function";
var cha = function(a,b){
for(var c in b){
if(a[c]==undefined)//子類重寫
a[c]=b[c];
}
return a;//返回繼承后的對象
}
if(fa&&fb){
b.apply(this,a.arguments);
cha(a,b);
this["base"] =new b;//通過base訪問父類
return cha(this,b.prototype);
}
else if(!fa&&fb){
cha(a,new b);
a["base"]= new b;
return cha(a,b);
}else if(fa&&!fb){
cha(a,b);
this["base"]=b;
return cha(this,b);
}else if(!fa&&!fb){
a["base"]=b;
return cha(a,b);
}
}
測試頁:用法
<html>
<head>
<script type="text/javascript" src="base.js"></script>
<script type="text/javascript">
var car2 = {
name:"轎車【父類】",
price:"幾萬【父類】",
start : function(){
alert(this.name+" 已啟動2!【父類】");
},
run : function(){
alert(this.name+" 在行駛當(dāng)中2。。?!靖割悺?);
},
stop: function(){
alert(this.name+" 已停止2!【父類】");
},
remark: function(){return "【父類】2我是一輛 "+this.name+";價(jià)值 "+this.price;}
// this.remark = "我是一輛 "+this.name+";價(jià)值 "+this.price;
}
//car2.prototype.extra = function(ext){
// return this.name+" 的關(guān)稅2是:"+ext;
//}
car2.protect = "【父類】2保護(hù)的";
car2.noExtra = function(){
return car.protect+" 不交關(guān)稅2【父類】";
}
var car = function(name,price){
this.name=name||"轎車 [父類]";
this.price=price||"幾萬[父類]";
this.start = function(){
alert(this.name+" 已啟動![父類]");
};
this.run = function(){
alert(this.name+" 在行駛當(dāng)中。。。[父類]");
};
this.stop= function(){
alert(this.name+" 已停止![父類]");
};
this.remark = function(){return "[父類]我是一輛 "+this.name+";價(jià)值 "+this.price;};
// this.remark = "我是一輛 "+this.name+";價(jià)值 "+this.price; //注意,這樣做 name 和price 將得不到傳參,故注釋
}
car.prototype.extra = function(ext){
return this.name+" 的關(guān)稅是[父類]:"+ext;
}
car.protect = "[父類]保護(hù)的";
car.noExtra = function(){
return car.protect+" 不交關(guān)稅[父類]";
}
var BMW = function(){
this.extendf(BMW,car);
this.name = "BMW【子類】";
this.start=function(){
alert(this.name+"專屬 啟動裝置!");
};
return ("this.name1="+this.name);
}
var BMW2 = function(){
this.extendf(BMW2,car2);
this.name = "寶馬終極2號【子類】";
this.start=function(){
alert(this.name+" 專屬 啟動裝置2號未來!");
};
return ("this.name1="+this.name);
}
var bensi = {
name:"bensi",
price:"130萬",
start:function(){
alert(this.name+" 華麗啟動!");
},
stop:function(){
alert(this.name+" 專用剎車停止!");
}
}
bensi.noExtra=function(){
return "誰敢收稅?";
}
var autuo = {
name:"autuo【子類】",
price:"1萬",
stop:function(){
alert(this.name+" 奧拓失靈了!");
}
}
function ChangAn(){
this.extendf(ChangAn,car);
// this.name = "CHANGAN【子類】";
this.run=function(){
alert(this.name+" 走的有點(diǎn)慢。。。");
}
}
var ftest = function(){
var tb = new BMW("寶馬","70萬");
testRun(tb);
alert(BMW.noExtra());
}
var ftest2 = function(){
var tb = bensi//("奔馳","120萬");
tb.extendf(bensi,car);
testRun(bensi);
alert(bensi.noExtra());
}
var ftest3 = function(){
var tb = new ChangAn("長安[傳參]","5萬");
testRun(tb);
alert(ChangAn.noExtra());
}
var ftest4 = function(){
var tb = autuo
tb.extendf(autuo,car2);
testRun(tb);
alert(autuo.noExtra());
}
var ftest5 = function(){
var tb = autuo
tb.extendf(autuo,bensi);
alert(tb.name);
tb.start();
tb.stop();
alert(autuo.noExtra());
}
var ftest6 = function(){
var tb = new BMW2("寶馬2號","65萬");
var scar = document.getElementById("showcar");
scar.innerHTML = tb.remark();
alert(tb.name);
tb.start();
tb.stop();
alert(BMW2.noExtra());
}
//測試輸出
function testRun(tb){
var scar = document.getElementById("showcar");
if(!scar) return false;
scar.innerHTML = tb.remark();
tb.base.start();
tb.start();
tb.base.run();
tb.run();
tb.base.stop();
tb.stop();
alert(tb.extra("1萬"));//父類為Object時(shí)這個(gè)會出錯(cuò),因?yàn)楦割惐旧砭蜎]有
}
</script>
</head>
<body>
js測試:
<input type = "button" value = "寶馬" onclick = "ftest()" >
<input type = "button" value = "奔馳" onclick = "ftest2()" >
<input type = "button" value = "長安" onclick = "ftest3()" >
<input type = "button" value = "奧拓" onclick = "ftest4()" >
<input type = "button" value = "奔馳類的奧拓" onclick = "ftest5()" >
<input type = "button" value = "寶馬2號" onclick = "ftest6()" >
<div id = "showcar"></div>
</body>
</html>
ps:沒有注意到性能問題,往大家改善
想只用一個(gè)參數(shù),不知道大家有沒有辦法?
嵌套類 沒試過。
【注】:繼承后,如果父類是一個(gè)類,則會繼承其屬性,方法(包括用prototype聲明的),靜態(tài)方法,否則只有屬性和方法。
復(fù)制代碼 代碼如下:
Object.prototype.extendf= function (a,b){
if(!a||!b) return;
var fa = typeof a=="function";
var fb = typeof b=="function";
var cha = function(a,b){
for(var c in b){
if(a[c]==undefined)//子類重寫
a[c]=b[c];
}
return a;//返回繼承后的對象
}
if(fa&&fb){
b.apply(this,a.arguments);
cha(a,b);
this["base"] =new b;//通過base訪問父類
return cha(this,b.prototype);
}
else if(!fa&&fb){
cha(a,new b);
a["base"]= new b;
return cha(a,b);
}else if(fa&&!fb){
cha(a,b);
this["base"]=b;
return cha(this,b);
}else if(!fa&&!fb){
a["base"]=b;
return cha(a,b);
}
}
測試頁:用法
復(fù)制代碼 代碼如下:
<html>
<head>
<script type="text/javascript" src="base.js"></script>
<script type="text/javascript">
var car2 = {
name:"轎車【父類】",
price:"幾萬【父類】",
start : function(){
alert(this.name+" 已啟動2!【父類】");
},
run : function(){
alert(this.name+" 在行駛當(dāng)中2。。?!靖割悺?);
},
stop: function(){
alert(this.name+" 已停止2!【父類】");
},
remark: function(){return "【父類】2我是一輛 "+this.name+";價(jià)值 "+this.price;}
// this.remark = "我是一輛 "+this.name+";價(jià)值 "+this.price;
}
//car2.prototype.extra = function(ext){
// return this.name+" 的關(guān)稅2是:"+ext;
//}
car2.protect = "【父類】2保護(hù)的";
car2.noExtra = function(){
return car.protect+" 不交關(guān)稅2【父類】";
}
var car = function(name,price){
this.name=name||"轎車 [父類]";
this.price=price||"幾萬[父類]";
this.start = function(){
alert(this.name+" 已啟動![父類]");
};
this.run = function(){
alert(this.name+" 在行駛當(dāng)中。。。[父類]");
};
this.stop= function(){
alert(this.name+" 已停止![父類]");
};
this.remark = function(){return "[父類]我是一輛 "+this.name+";價(jià)值 "+this.price;};
// this.remark = "我是一輛 "+this.name+";價(jià)值 "+this.price; //注意,這樣做 name 和price 將得不到傳參,故注釋
}
car.prototype.extra = function(ext){
return this.name+" 的關(guān)稅是[父類]:"+ext;
}
car.protect = "[父類]保護(hù)的";
car.noExtra = function(){
return car.protect+" 不交關(guān)稅[父類]";
}
var BMW = function(){
this.extendf(BMW,car);
this.name = "BMW【子類】";
this.start=function(){
alert(this.name+"專屬 啟動裝置!");
};
return ("this.name1="+this.name);
}
var BMW2 = function(){
this.extendf(BMW2,car2);
this.name = "寶馬終極2號【子類】";
this.start=function(){
alert(this.name+" 專屬 啟動裝置2號未來!");
};
return ("this.name1="+this.name);
}
var bensi = {
name:"bensi",
price:"130萬",
start:function(){
alert(this.name+" 華麗啟動!");
},
stop:function(){
alert(this.name+" 專用剎車停止!");
}
}
bensi.noExtra=function(){
return "誰敢收稅?";
}
var autuo = {
name:"autuo【子類】",
price:"1萬",
stop:function(){
alert(this.name+" 奧拓失靈了!");
}
}
function ChangAn(){
this.extendf(ChangAn,car);
// this.name = "CHANGAN【子類】";
this.run=function(){
alert(this.name+" 走的有點(diǎn)慢。。。");
}
}
var ftest = function(){
var tb = new BMW("寶馬","70萬");
testRun(tb);
alert(BMW.noExtra());
}
var ftest2 = function(){
var tb = bensi//("奔馳","120萬");
tb.extendf(bensi,car);
testRun(bensi);
alert(bensi.noExtra());
}
var ftest3 = function(){
var tb = new ChangAn("長安[傳參]","5萬");
testRun(tb);
alert(ChangAn.noExtra());
}
var ftest4 = function(){
var tb = autuo
tb.extendf(autuo,car2);
testRun(tb);
alert(autuo.noExtra());
}
var ftest5 = function(){
var tb = autuo
tb.extendf(autuo,bensi);
alert(tb.name);
tb.start();
tb.stop();
alert(autuo.noExtra());
}
var ftest6 = function(){
var tb = new BMW2("寶馬2號","65萬");
var scar = document.getElementById("showcar");
scar.innerHTML = tb.remark();
alert(tb.name);
tb.start();
tb.stop();
alert(BMW2.noExtra());
}
//測試輸出
function testRun(tb){
var scar = document.getElementById("showcar");
if(!scar) return false;
scar.innerHTML = tb.remark();
tb.base.start();
tb.start();
tb.base.run();
tb.run();
tb.base.stop();
tb.stop();
alert(tb.extra("1萬"));//父類為Object時(shí)這個(gè)會出錯(cuò),因?yàn)楦割惐旧砭蜎]有
}
</script>
</head>
<body>
js測試:
<input type = "button" value = "寶馬" onclick = "ftest()" >
<input type = "button" value = "奔馳" onclick = "ftest2()" >
<input type = "button" value = "長安" onclick = "ftest3()" >
<input type = "button" value = "奧拓" onclick = "ftest4()" >
<input type = "button" value = "奔馳類的奧拓" onclick = "ftest5()" >
<input type = "button" value = "寶馬2號" onclick = "ftest6()" >
<div id = "showcar"></div>
</body>
</html>
ps:沒有注意到性能問題,往大家改善
想只用一個(gè)參數(shù),不知道大家有沒有辦法?
嵌套類 沒試過。
您可能感興趣的文章:
- 一個(gè)JavaScript繼承的實(shí)現(xiàn)
- 利用javascript中的call實(shí)現(xiàn)繼承
- 用JavaScript實(shí)現(xiàn)單繼承和多繼承的簡單方法
- Javascript 繼承實(shí)現(xiàn)例子
- Javascript 繼承機(jī)制的實(shí)現(xiàn)
- 實(shí)現(xiàn)JavaScript中繼承的三種方式
- javascript 面向?qū)ο?實(shí)現(xiàn)namespace,class,繼承,重載
- js對象的構(gòu)造和繼承實(shí)現(xiàn)代碼
- ExtJS4中使用mixins實(shí)現(xiàn)多繼承示例
- 深入理解JavaScript是如何實(shí)現(xiàn)繼承的
- 詳解Javascript繼承的實(shí)現(xiàn)
相關(guān)文章
如何解決前端筆記本屏幕顯示縮放比例125%,150%對頁面布局的影響
如果要完整解決該縮放和布局問題,仍需適配,下面這篇文章主要給大家介紹了關(guān)于如何解決前端筆記本屏幕顯示縮放比例125%,150%對頁面布局的影響,需要的朋友可以參考下2022-11-11JavaScript代碼性能優(yōu)化總結(jié)(推薦)
下面小編就為大家?guī)硪黄狫avaScript代碼性能優(yōu)化總結(jié)(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考,一起跟隨小編過來看看吧,祝大家游戲愉快哦2016-05-05微信小程序用swiper實(shí)現(xiàn)滑動刻度尺
這篇文章主要為大家詳細(xì)介紹了微信小程序用swiper實(shí)現(xiàn)滑動刻度尺,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06JS關(guān)于刷新頁面的相關(guān)總結(jié)
在本篇內(nèi)容中我們給大家整理了關(guān)于JS刷新頁面的所有相關(guān)知識點(diǎn)以及整理了相關(guān)的技術(shù)文章,大家可以收藏本頁面繼續(xù)深入學(xué)習(xí)。2018-05-05Javascript刪除指定元素節(jié)點(diǎn)的方法
這篇文章主要介紹了使用Javascript刪除指定元素節(jié)點(diǎn)的方法,通俗易懂,需要的朋友可以參考下。2016-06-06List the Codec Files on a Computer
List the Codec Files on a Computer...2007-06-06可能是全網(wǎng)最詳細(xì)小程序中使用echarts的教程
在開發(fā)微信小程序時(shí),有需求需要使用到柱狀圖,餅圖等圖表,下面這篇文章主要給大家介紹了關(guān)于小程序中使用echarts的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10javascript表單驗(yàn)證 - Parsley.js使用和配置
大家還記得我們曾經(jīng)介紹過的表單驗(yàn)證jquery插件jquery.validationEngine吧;天介紹的Parsley同樣也可以幫助你只使用簡單的配置即可實(shí)現(xiàn)表單驗(yàn)證功能,基于它的強(qiáng)大DOM-API,感興趣的你可以不要錯(cuò)過了哦2013-01-01