javascript:物件導向編程基礎:多態

來源:互聯網
上載者:User
js的重載和重寫(覆寫):
重載的意思是,“同一個名字的函數(注意這裡包括函數)或方法可以有多個實現,它們依靠參數的類型和(或)參數的個數來區分識別”。 而重寫(覆蓋)的意思是,“子類中可以定義與父類中同名,並且參數類型和個數也相同的方法,這些方法的定義後,在子類的執行個體化對象中,父類中繼承的這些同名方法將被隱藏”。重載的英文是overload,覆蓋的英文是override。好了,概念介紹到這裡,你猜到我要說什麼了嗎?嘿嘿,Code is cheap.看重載代碼:Code
// 通過函數的arguments屬性實現重載
function add() {
    var sum = 0;
    for (var i = 0; i < arguments.length; i++) {
        sum += arguments[i];
    }
    return sum;
}

function test() {
    alert(add());
    alert(add(1,2));
    alert(add(1,2,3));
}

通過代碼運行結果,這樣就實現了任意多個參數加法函數的重載了。當然,你還可以在函數中通過 instanceof 或者 constructor 來判斷每個參數的類型,來決定後面執行什麼操作,實現更為複雜的函數或方法重載。總之,javascript 的重載,是在函數中由使用者自己通過操作 arguments 這個屬性來實現的。關於arguments的特性,前面我已經做了簡單介紹,參考拙文:http://www.cnblogs.com/jeffwongishandsome/archive/2008/10/16/1312139.html。
下面重點理解js重寫的實現:Code
//為類添加靜態方法inherit表示繼承於某類 
Function.prototype.inherit = function(baseClass) {
    for (var p in baseClass.prototype) {
        this.prototype[p] = baseClass.prototype[p];
    }
}

//js實現重寫
function parentClass() { // 父類
}

parentClass.prototype.method = function() {
    alert("parentClass method");
}

function subClass() { // 子類
}

// 下面這一句和subClass.prototype = new parentClass();等價
subClass.inherit(parentClass);

//subClass.prototype.method = function() { // 子類重寫了父類的方法 -- 去掉注釋運行試試看
//    alert("subClass method");
//}

function test() {
    var obj = new subClass();
    obj.method();
}

這樣,子類中定義的method 就覆蓋了從父類中繼承來的method 方法了。這是你可能會問,如何在子類中調用父類的method方法呢?好的,看實現如下:Code
//為類添加靜態方法inherit表示繼承於某類 
Function.prototype.inherit = function(baseClass) {
    for (var p in baseClass.prototype) {
        this.prototype[p] = baseClass.prototype[p];
    }
}
/*參考文章:http://menjoy.javaeye.com/blog/127847*/
//js實現重寫
function parentClass() {
    this.method = function() {
        alert("parentClass method");
    }
}
function subClass() {
    var method = this.method;
    this.method = function() {
        method.call(this);
        alert("subClass method");
    }
}
subClass.prototype = new parentClass();
//subClass.inherit(parentClass); //這一句貌似和上一句subClass.prototype = new parentClass();等價,其實呢????(注釋上一行,運行這一行看看)
subClass.prototype.constructor = subClass;

function test() {
    var obj = new subClass();
    obj.method();
}

好了,關於多態的介紹就到這裡。js物件導向編程猶如浩瀚海洋廣闊無邊,我這三篇參考別人的文章寫出來的js物件導向基礎只能當作入門者學習的參考。學無止境,參考了網上幾篇老大們的牛文,深知自身技術的淺薄,對於已經超越瞭解階段的讀者,還是看看園子裡高人的技術文章吧。我這裡要先拜謝園子裡的高人了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.