首頁  >  文章  >  web前端  >  jquery中val函數重載的實作方法(附程式碼)

jquery中val函數重載的實作方法(附程式碼)

不言
不言原創
2018-08-21 09:52:301452瀏覽

這篇文章帶給大家的內容是關於jquery中val函數重載的實作方法(附程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

所謂重載,就是一組相同的函數名,有不同個數的參數,使用時呼叫一個函數名,傳入不同參數,根據你的參數個數,來決定使用不同的函數!但我們知道js中是沒有重載的,因為後面定義的函數會覆寫前面的同名函數,但是我們又想實作函數重載該怎麼辦呢?

第一種方法:

這種方法比較簡單,給一個思路,大家一定都能理解,就是函數內部用switch語句,根據傳入參數的個數呼叫不同的case語句,從而在功能上達到重載的效果。

這個方法簡單粗暴

第二種方法:

function method(obj,name,fnc){
            var old = obj[name];
            console.log(old instanceof Function);
            obj[name] = function(){
                console.log(arguments.length+" "+fnc.length);
                if(arguments.length === fnc.length){
                    return fnc.apply(this,arguments);
                }else if(typeof old === "function"){
                    return old.apply(this,arguments);
                }
            }
        }
        var people = {
            values:["Zhang san","Li si"]
        };
        method(people,"find",function(){
            console.log("无参数");
            return this.values;
        })
        method(people,"find",function(firstname){
            console.log("一个参数");
            var ret = [];
            for(var i = 0;i < this.values.length;i++){
                if(this.values[i].indexOf(firstname) === 0){
                    ret.push(this.values[i])
                }
            }
            return ret;
        })
        method(people,"find",function(firstname,lastname){
            console.log("两个参数");
            var ret = [];
            for(var i = 0;i < this.values.length;i++){
                if(this.values[i] == firstname + " " + lastname){
                    ret.push(this.values[i])
                }
            }
            return ret;
        })
        console.log(people.find());
        console.log(people.find("Zhang"));

實作過程:我們看一下上面這段程式碼,最重要的是method方法的定義:這個方法中最重要的一點就是這個old,這個old真的很巧妙。它的作用相當於一個指針,指向上一次被呼叫的method函數,這樣說可能有點不太懂,我們根據程式碼來說,js的解析順序從上到下為。

  1.解析method(先不管裡面的東西)

  2.method(people,"find",function()  執行這句話的時候,它就回去執行上面定義的方法,然後此時old的值為空,因為你還沒有定義過這個函數,所以它此時是undefined,然後繼續執行,這是我們才定義obj[name] = function(),然後js解析的時候發現回傳了fnc函數,更重要的是fnc函數裡面還呼叫了method裡面的變量,這不就是閉包了,因為fnc函數的實作是在呼叫時候才會去實現,所以js就想,這我執行完也不能刪除啊,要不外面那個用啥,就留著吧先(此處用call函數改變了fnc函數內部的this指向)

  3.好了第一次method的使用結束了,開始了第二句,method(people,"find",function(firstname) 然後這次使用的時候,又要執行old = obj[name]此時的old是什麼,是函數了,因為上一條語句定義過了,而且沒有刪除,那我這次的old實際上指向的是上次定義的方法,它起的作用好像一個指針,指向了上一次定義的obj[name]。然後繼續往下解析,又是閉包,還得留著。

  4.第三此的method調用開始了,同理old指向的是上次定義的obj[name] 同樣也還是閉包,還得留著。

  5.到這裡,內存中實際上有三個obj[name],因為三次method的內存都沒有刪除,這是不是實現了三個函數共存,同時還可以用old將它們連結起來是不是很巧妙

  6.我們people.find() 的時候,就會最先調用最後一次調用method時定義的function,如果參數個數相同也就是 arguments.length === fnc.length 那就執行就好了,也不用找別的函數了,如果不相同的話,那就得用到old了 return old.apply(this,arguments); old指向的是上次method調用時定義的函數,所以我們就去上一次的找,如果找到了,繼續執行arguments.length === fnc.length  如果找不到,再次調用old 繼續向上找,只要你定義過,肯定能找到的,對吧!

  總結:運用閉包的原理使三個函數共存於內存中,old相當於一個指針,指向上一次定義的function,每次調用的時候,決定是否需要尋找。

後續:說完上面的再對比下面的理解,會更深入的理解原型與原型鏈

var array=[]
addMethod(array,&#39;sub0&#39;,function(){
  return 0;
})
addMethod(array,&#39;sub0&#39;,function(prefix){
  console.log("prefix===>",prefix);
  return prefix[0];
})
array.sub0([1,2,3,5])  //这里是array对象拥有了sub0这样的方法,而不是Array,addMethod是继承

// 区别于方法直接作用于原型上
//例子  String的 startsWith 实现
function addstartsWithToString(){
   if (typeof String.prototype.startsWith1 != &#39;function&#39; ) {
     String.prototype.startsWith1 = function(subString){
       return this.slice(0,subString.length)==subString
     }
   }
}

addstartsWithToString();
&#39;120000&#39;.startsWith1(&#39;1&#39;)

相關推薦:

##JavaScript中實現函數重載與參數預設值

Jquery 實作Tab效果 想法是js想法_jquery

##如何實作JS函數的重載_javascript技巧

以上是jquery中val函數重載的實作方法(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn