JavaScript物件導向之方法重載

來源:互聯網
上載者:User
作者:Truly
日期:2007.7.29

上次我們在《在JavaScript中使用物件導向》討論了對象的聲明、成員的聲明、全域變數和局部變數以及命名空間的處理。本文繼續討論物件導向,今天介紹方法重載

同時上次有人詢問Function對象的apply方法和call方法的區別,本文將一併進行探討。

首先我們需要知道Javascript有很多語言特點使得我們不能完全按照以往的編程經驗進行編程,比如方法重載。在前一篇文章中,我們已經介紹過,在Javascript中後面的同名變數會覆蓋前面的,所以想直接聲明重載方法是不可行的。但是,Javascript的魅力就在於靈活,因此所有的期望都必然得到答案。

為了節省時間,今天我將所有的代碼集中在一起,不再獨立講解,請看如下代碼:

<script type='text/javascript'>

function ABC()
{
    this.member = 1;
    this.method = Show;
}
function Show(a,b,c)
{
    this.member = 123;
    if(arguments.length==1)
        if(arguments[0].constructor == Number)
            Show1_int.apply(this, arguments);
        else if(arguments[0].constructor == Date)
            Show1_date.apply(this, arguments);
        else
            Show1_string.apply(this, arguments);
    if(arguments.length==2)
        if(arguments[0].constructor == Array)
            Show3.apply(this,arguments);
        else
            Show2.apply(this,arguments);
}
function Show1_int(a)
{
    alert('1 integer input parameter ' + a+ '  methode is called');
}
function Show1_string(a)
{
    alert('1 string input parameter ' + a+ '  methode is called');
}
function Show1_date(a)
{
    alert('1 date input parameter ' + a+ '  methode is called');
}

function Show2(a,b)
{
    alert('2 input parameter is transfer:\na:'+a+'\nb:'+b + '\nthe member is' + this.member);
}
// 示範引用方式傳遞
function Show3(a,b)
{
    arguments[0][0]=2;
    alert('2 input parameter is transfer:\na:'+a+'\nb:'+b + '\nthe member is' + this.member);
}
var o = new ABC();
var arr = new Array();
arr[0]=321;
o.method(arr[0],2);    // 值傳遞
alert(arr[0]);        // 原始值未改變
o.method(arr,2);    // 引用方式傳遞
alert(arr[0]);        // 方法調用時被方法修改
o.method(new Date());

</script>

我們無法直接定義重載方法,但是卻可以為其他函數定義一個公開的重載方法調用。通過這種方式,對於調用者而言,重載的方法是透明的,只需調用方法名並傳入適當的參數即可,與多數進階語言一樣,不可定義傳入參數相同而傳回型別不同的重載方法。

下面我們再分析一下callapply的區別,所有的函數都具有這兩個方法,它們在使用上沒有太大差別,主要區別就在於傳入參數不同:

call使用可變參數序列進行值傳遞,而apply則使用數組或者arguments對象進行傳遞。

call方法的文法:
call([thisObj[,arg1[, arg2[,   [,.argN]]]]])

參數
thisObj 
可選項。將被用作當前對象的對象。 
arg1, arg2, , argN 
可選項。將被傳遞方法參數序列。 
說明
call 方法可以用來代替另一個對象調用一個方法。call 方法可將一個函數的物件內容從初始的上下文改變為由 thisObj 指定的新對象。

如果沒有提供 thisObj 參數,那麼 Global 對象被用作 thisObj。

apply方法的文法:
apply([thisObj[,argArray]])

參數
thisObj 
可選項。將被用作當前對象的對象。 
argArray 
可選項。將被傳遞給該函數的參數數組。 
說明
如果 argArray 不是一個有效數組或者不是 arguments 對象,那麼將導致一個 TypeError。

如果沒有提供 argArray 和 thisObj 任何一個參數,那麼 Global 對象將被用作 thisObj, 並且無法被傳遞任何參數。

註:以上資料來自《Jscript參考手冊》

小節:通過show2方法,我們看到使用call或者apply方式可以將當前對象傳遞到方法內部,以此來訪問當前對象的一些成員。這使得我們可以定義一些方法,給不同的自訂類進行調用,具體可以查看上篇文章我們定義的一個繼承結構。

同時通過上面例子我們還示範了兩者進行傳遞時,參數的傳遞方式會根據參數的不同而不同,如果是值變數則使用值傳遞,否則以引用方式傳遞。

尾聲:當我們使用JavaScript的時候,你必須瞭解和掌握JavaScript的一些特點,它跟進階程式設計語言存在著一些區別,它靈活的特點給我們的開發帶來了極大的靈活性,因此一旦深入JavaScript編程,我保證,你會毫無理由的喜歡上它。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.