欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JScript重載的另類實(shí)現(xiàn)

 更新時(shí)間:2007年01月11日 00:00:00   作者:  
JScript并不是面向?qū)ο蟮恼Z(yǔ)言,只是基于對(duì)象。它沒(méi)有重載這個(gè)概念,但通過(guò)一些技巧還是有辦法從某種意義上實(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)文章

最新評(píng)論