妙用緩存調用鏈實現JS方法的重載

來自於個人博客http://sweets.cf/,轉載註明出處

1.什麼是方法重載

方法重載是指在一個類中定義多個同名的方法,但要求每一個方法具備不一樣的參數的類型或參數的個數。
簡而言之就是:方法重載就是方法名稱重複,加載參數不一樣。javascript

具體看請左轉: 方法重載/百度百科
那麼js如何實現這個呢???
java

2. js如何實現?

首先javascript是沒有重載函數/方法這個概念的,可是js提供了一個arguments這個方法參數,經過這個參數的length屬性就能夠拿到方法參數的長度,o~對了,我們今天實現的也僅僅是按照參數長度重載,而不是參數類型~~·length ,
那麼及下載呢,一旦有了方法參數長度,因而出現了比常見的switch寫法:緩存

var seven={
    dosomething:function(){
        switch(arguments.length){
            case 0:
                console.log(arguments.length);
                //dosomething
                break;
            case 1:
                console.log(arguments.length);
                //dosomething
                break;
             case 2:
                //dosomething
                console.log(arguments.length);
                break;
        }
    }
}

3.優化

wow~若是10個方法就須要10個分支~並且很很差維護~由於每一個方法體都在case下,或者單獨提出來寫成一個function~
而後這些都是很差的~不易維護的,逼格不夠高的~那麼我們應該如何優雅的實現對於不一樣參數的同一方法名的處理呢?
這就用到這個 apply 這個方法了.
我們爲seven編寫一個addMethod方法閉包

var seven = {
    addMethod: function (fname, func) {
        var old = this[fname];
        this[fname] = function () {
            if (arguments.length == func.length) {
                return func.apply(this,arguments);
            }
            if (typeof old == 'function') {
                return old.apply(this, arguments);
            }
        }
    }
};

修改後的seven如上,而後以前寫的switch就能夠這樣搞了:app

seven.addMethod('dosomething', function (x) {
    console.log(arguments.length);
      //dosomething
});
seven.addMethod('dosomething', function (x,y) {
    console.log(arguments.length);
      //dosomething
});
seven.addMethod('dosomething', function (x,y,z) {
    console.log(arguments.length);
      //dosomething
});

我們要增長方法,只須要調用這個addMethod方法就ok了,是否是以爲簡單明瞭,更加清晰。
那麼這段代碼的原理呢,其實也很簡單,就是緩存舊方法,而後根據參數長度依次apply鏈式調用,直到找到和當前參數等長的方法~而後進行調用。
funcold 頗有可能讓初來乍到的童鞋們迷惑,其實否則,這裏巧妙的使用了JavaScript語言的特性,這個old每一次保存的都是上一次方法的引用,
並且每次都是全新的,而舊的old又保持着引用,這是什麼呢?閉包嘍~。函數

相關文章
相關標籤/搜索