JScript重載的另類實(shí)現(xiàn)
首先定義一個(gè)基類TestA,該類重寫了Object繼承下來(lái)的toString方法。
注:toString方法是用于序列化對(duì)象,比如說(shuō)alert(a)相當(dāng)于alert(a.toString());
引用:
function TestA(Name)
{
this.Name = Name;
this.toString = function ()
{
return this.Name;
}
}
接下來(lái)我們實(shí)現(xiàn)一個(gè)TestA類的派生類TestB:
引用:
function TestB()
{
TestA.apply(this, arguments);
}
運(yùn)行以下代碼可以看出TestB已經(jīng)繼承下TestA的成員:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
現(xiàn)在我們來(lái)給TestB添加一個(gè)自己的toString方法,但問(wèn)題是如果定義了TestB的toString,那么TestA繼承下來(lái)的toString就被覆蓋了,我的做法是:在重寫之前先保存下TestA的toString為TestB的_TestA_toString,然后在TestB的toString中根據(jù)參數(shù)來(lái)判斷要調(diào)用_TestA_toString還是TestB自己的toString代碼
引用:
function TestB()
{
TestA.apply(this, arguments);
this._TestA_toString = this.toString; // 保存下TestA的toString
this.toString = function(isTestB)
{
if(isTestB)
{
return "TestB的Name是" + this.Name;
}
else
{
return this._TestA_toString(); // 這里調(diào)用TestA的toString,即_TestA_toString
}
}
}
以上的toString不單單是TestB自己的toString,還根據(jù)參數(shù)情況調(diào)用了原來(lái)的toString,實(shí)現(xiàn)了重載。
最終代碼是:
引用:
function TestA(Name)
{
this.Name = Name;
this.toString = function()
{
return this.Name;
}
}
function TestB()
{
TestA.apply(this, arguments);
this._TestA_toString = this.toString; // 保存下TestA的toString
this.toString = function(isTestB)
{
if(isTestB)
{
return "TestB的Name是" + this.Name;
}
else
{
return this._TestA_toString(); // 這里調(diào)用TestA的toString,即_TestA_toString
}
}
}
var B = new TestB("泣紅亭");
alert(B);
alert(B.toString(true));
看看運(yùn)行效果:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>測(cè)試代碼</title>
</head>
<body>
<script>
function TestA(Name)
{
this.Name = Name;
this.toString = function()
{
return this.Name;
}
}
function TestB()
{
TestA.apply(this, arguments);
this._TestA_toString = this.toString; // 保存下TestA的toString
this.toString = function(isTestB)
{
if(isTestB)
{
return "TestB的Name是" + this.Name;
}
else
{
return this._TestA_toString(); // 這里調(diào)用TestA的toString,即_TestA_toString
}
}
}
var B = new TestB("泣紅亭");
alert(B);
alert(B.toString(true));
</script>
</body>
</html>
提示:您可以先修改部分代碼再運(yùn)行
運(yùn)行結(jié)果:
引用:
alert(B); // 即alert(B.toString()), 結(jié)果是"泣紅亭"
alert(B.toString(true)) // 即isTestB為true,結(jié)果是"TestB的Name是泣紅亭"
其實(shí)這樣子不算是真正的重載,而是先保存原來(lái)的成員為一個(gè)副本,然后改寫該成員,在新成員代碼中根據(jù)參數(shù)再判斷是否調(diào)用舊成員代碼。
相關(guān)文章
解決FireFox下[使用event很麻煩]的問(wèn)題
解決FireFox下[使用event很麻煩]的問(wèn)題...2006-11-11基于bootstrap實(shí)現(xiàn)bootstrap中文網(wǎng)巨幕效果
這篇文章主要介紹了基于bootstrap實(shí)現(xiàn)bootstrap中文網(wǎng)巨幕效果,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-05-05javascript 產(chǎn)生隨機(jī)數(shù)的幾種方法總結(jié)
這篇文章主要介紹了javascript 產(chǎn)生隨機(jī)數(shù)的幾種方法總結(jié)的相關(guān)資料,希望通過(guò)本文大家能夠掌握如何實(shí)現(xiàn)這樣的方法,需要的朋友可以參考下2017-09-09JavaScript獲取一個(gè)范圍內(nèi)日期的方法
這篇文章主要介紹了JavaScript獲取一個(gè)范圍內(nèi)日期的方法,涉及javascript操作日期的相關(guān)技巧,需要的朋友可以參考下2015-04-04BootStrap Datepicker 插件修改為默認(rèn)中文的實(shí)現(xiàn)方法
bootstrap-datepicker 是一個(gè)非常優(yōu)秀的時(shí)間選擇插件,默認(rèn)是英文顯示日期的,通過(guò)下面幾個(gè)小修改讓其支持默認(rèn)中文。下面通過(guò)本文給大家介紹BootStrap Datepicker 插件修改為默認(rèn)中文的實(shí)現(xiàn)方法,一起看看吧2017-02-02javascript自動(dòng)恢復(fù)文本框點(diǎn)擊清除后的默認(rèn)文本
這篇文章主要介紹了javascript自動(dòng)恢復(fù)文本框點(diǎn)擊清除后的默認(rèn)文本的實(shí)現(xiàn)方法,感興趣的小伙伴們可以參考一下2016-01-01教你使用javascript簡(jiǎn)單寫一個(gè)頁(yè)面模板引擎
不知道你有木有聽(tīng)說(shuō)過(guò)一個(gè)基于Javascript的Web頁(yè)面預(yù)處理器,叫做AbsurdJS。只是打算寫一個(gè)CSS的預(yù)處理器,后來(lái)擴(kuò)展到了CSS和HTML,可以用來(lái)把Javascript代碼轉(zhuǎn)成CSS和HTML代碼。當(dāng)然,由于可以生成HTML代碼,你也可以把它當(dāng)成一個(gè)模板引擎,用于在標(biāo)記語(yǔ)言中填充數(shù)據(jù)。2015-05-05(JS實(shí)現(xiàn))MapBar中坐標(biāo)的加密和解密的腳本
(JS實(shí)現(xiàn))MapBar中坐標(biāo)的加密和解密的腳本...2007-05-05