JScript重載的另類實(shí)現(xiàn)
更新時(shí)間:2007年01月11日 00:00:00 作者:
JScript并不是面向?qū)ο蟮恼Z言,只是基于對(duì)象。它沒有重載這個(gè)概念,但通過一些技巧還是有辦法從某種意義上實(shí)現(xiàn)重載。
首先定義一個(gè)基類TestA,該類重寫了Object繼承下來的toString方法。
注:toString方法是用于序列化對(duì)象,比如說alert(a)相當(dāng)于alert(a.toString());
引用:
function TestA(Name)
{
this.Name = Name;
this.toString = function ()
{
return this.Name;
}
}
接下來我們實(shí)現(xiàn)一個(gè)TestA類的派生類TestB:
引用:
function TestB()
{
TestA.apply(this, arguments);
}
運(yùn)行以下代碼可以看出TestB已經(jīng)繼承下TestA的成員:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
現(xiàn)在我們來給TestB添加一個(gè)自己的toString方法,但問題是如果定義了TestB的toString,那么TestA繼承下來的toString就被覆蓋了,我的做法是:在重寫之前先保存下TestA的toString為TestB的_TestA_toString,然后在TestB的toString中根據(jù)參數(shù)來判斷要調(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)用了原來的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í)這樣子不算是真正的重載,而是先保存原來的成員為一個(gè)副本,然后改寫該成員,在新成員代碼中根據(jù)參數(shù)再判斷是否調(diào)用舊成員代碼。
首先定義一個(gè)基類TestA,該類重寫了Object繼承下來的toString方法。
注:toString方法是用于序列化對(duì)象,比如說alert(a)相當(dāng)于alert(a.toString());
引用:
function TestA(Name)
{
this.Name = Name;
this.toString = function ()
{
return this.Name;
}
}
接下來我們實(shí)現(xiàn)一個(gè)TestA類的派生類TestB:
引用:
function TestB()
{
TestA.apply(this, arguments);
}
運(yùn)行以下代碼可以看出TestB已經(jīng)繼承下TestA的成員:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
現(xiàn)在我們來給TestB添加一個(gè)自己的toString方法,但問題是如果定義了TestB的toString,那么TestA繼承下來的toString就被覆蓋了,我的做法是:在重寫之前先保存下TestA的toString為TestB的_TestA_toString,然后在TestB的toString中根據(jù)參數(shù)來判斷要調(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)用了原來的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í)這樣子不算是真正的重載,而是先保存原來的成員為一個(gè)副本,然后改寫該成員,在新成員代碼中根據(jù)參數(shù)再判斷是否調(diào)用舊成員代碼。
相關(guān)文章
ES6數(shù)組復(fù)制和填充方法copyWithin()、fill()的具體使用
本文主要介紹了ES6數(shù)組復(fù)制和填充方法copyWithin()、fill()的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
JavaScript實(shí)現(xiàn)二維坐標(biāo)點(diǎn)排序效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)二維坐標(biāo)點(diǎn)排序效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
javascript function(函數(shù)類型)使用與注意事項(xiàng)小結(jié)
這篇文章主要介紹了javascript function(函數(shù)類型)使用與注意事項(xiàng),結(jié)合實(shí)例形式較為詳細(xì)的分析了Function(函數(shù))類型的基本聲明、屬性、方法相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2019-06-06
javascript解決小數(shù)的加減乘除精度丟失的方案
這篇文章主要介紹了javascript解決小數(shù)的加減乘除精度丟失的方案的相關(guān)資料以及JavaScript中關(guān)于丟失數(shù)字精度的問題的探討,非常的詳細(xì),需要的朋友可以參考下2016-05-05
layui2.0使用table+laypage實(shí)現(xiàn)真分頁
這篇文章主要為大家詳細(xì)介紹了layui2.0使用table+laypage實(shí)現(xiàn)真分頁,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
js實(shí)現(xiàn)對(duì)ajax請(qǐng)求面向?qū)ο蟮姆庋b
這篇文章主要介紹了js實(shí)現(xiàn)對(duì)ajax請(qǐng)求面向?qū)ο蟮姆庋b的相關(guān)資料,需要的朋友可以參考下2016-01-01
JS如何實(shí)現(xiàn)頁面截屏功能實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于JS如何實(shí)現(xiàn)頁面截屏功能的相關(guān)資料,文中主要利用了html2canvas和canvas繪制兩個(gè)方法來實(shí)現(xiàn),需要的朋友可以參考下2021-06-06
JavaScript代碼實(shí)現(xiàn)簡(jiǎn)單日歷效果
這篇文章主要為大家詳細(xì)介紹了JavaScript代碼實(shí)現(xiàn)簡(jiǎn)單日歷效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04

