国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

jquery里面val函數(shù)重載的實(shí)現(xiàn)思路

learn_shifeng / 2264人閱讀

摘要:后續(xù)說完上面的再對(duì)比下面的理解,會(huì)更深入的理解原型與原型鏈這里是對(duì)象擁有了這樣的方法,而不是,是繼承區(qū)別于方法直接作用于原型上例子的實(shí)現(xiàn)

所謂重載,就是一組相同的函數(shù)名,有不同個(gè)數(shù)的參數(shù),在使用時(shí)調(diào)用一個(gè)函數(shù)名,傳入不同參數(shù),根據(jù)你的參數(shù)個(gè)數(shù),來決定使用不同的函數(shù)!但是我們知道js中是沒有重載的,因?yàn)楹蠖x的函數(shù)會(huì)覆蓋前面的同名函數(shù),但是我們又想實(shí)現(xiàn)函數(shù)重載該怎么辦呢?

第1種方法:

  這種方法比較簡單,給一個(gè)思路,大家肯定都能理解,就是函數(shù)內(nèi)部用switch語句,根據(jù)傳入?yún)?shù)的個(gè)數(shù)調(diào)用不同的case語句,從而功能上達(dá)到重載的效果。

  這種方法簡單粗暴

第二種方法

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("無參數(shù)");
            return this.values;
        })
        method(people,"find",function(firstname){
            console.log("一個(gè)參數(shù)");
            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("兩個(gè)參數(shù)");
            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"));

實(shí)現(xiàn)過程:我們看一下上面這段代碼,最重要的是method方法的定義:這個(gè)方法中最重要的一點(diǎn)就是這個(gè)old,這個(gè)old真的很巧妙。它的作用相當(dāng)于一個(gè)指針,指向上一次被調(diào)用的method函數(shù),這樣說可能有點(diǎn)不太懂,我們根據(jù)代碼來說,js的解析順序從上到下為。

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

  2.method(people,"find",function() 執(zhí)行這句的時(shí)候,它就回去執(zhí)行上面定義的方法,然后此時(shí)old的值為空,因?yàn)槟氵€沒有定義過這個(gè)函數(shù),所以它此時(shí)是undefined,然后繼續(xù)執(zhí)行,這是我們才定義 obj[name] = function(),然后js解析的時(shí)候發(fā)現(xiàn)返回了fnc函數(shù),更重要的是fnc函數(shù)里面還調(diào)用了method里面的變量,這不就是閉包了,因?yàn)閒nc函數(shù)的實(shí)現(xiàn)是在調(diào)用時(shí)候才會(huì)去實(shí)現(xiàn),所以js就想,這我執(zhí)行完也不能刪除啊,要不外面那個(gè)用啥,就留著吧先(此處用call函數(shù)改變了fnc函數(shù)內(nèi)部的this指向)

  3.好了第一次method的使用結(jié)束了,開始了第二句,method(people,"find",function(firstname) 然后這次使用的時(shí)候,又要執(zhí)行old = obj[name]此時(shí)的old是什么,是函數(shù)了,因?yàn)樯弦粭l語句定義過了,而且沒有刪除,那我這次的old實(shí)際上指向的是上次定義的方法,它起的作用好像一個(gè)指針,指向了上一次定義的 obj[name]。然后繼續(xù)往下解析,又是閉包,還得留著。

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

  5.到這里,內(nèi)存中實(shí)際上有三個(gè) obj[name],因?yàn)槿蝝ethod的內(nèi)存都沒有刪除,這是不是實(shí)現(xiàn)了三個(gè)函數(shù)共存,同時(shí)還可以用old將它們聯(lián)系起來是不是很巧妙

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

  總結(jié):運(yùn)用閉包的原理使三個(gè)函數(shù)共存于內(nèi)存中,old相當(dāng)于一個(gè)指針,指向上一次定義的function,每次調(diào)用的時(shí)候,決定是否需要尋找。

后續(xù):說完上面的再對(duì)比下面的理解,會(huì)更深入的理解原型與原型鏈

var array=[]
addMethod(array,"sub0",function(){
  return 0;
})
addMethod(array,"sub0",function(prefix){
  console.log("prefix===>",prefix);
  return prefix[0];
})
array.sub0([1,2,3,5])  //這里是array對(duì)象擁有了sub0這樣的方法,而不是Array,addMethod是繼承

// 區(qū)別于方法直接作用于原型上
//例子  String的 startsWith 實(shí)現(xiàn)
function addstartsWithToString(){
   if (typeof String.prototype.startsWith1 != "function" ) {
     String.prototype.startsWith1 = function(subString){
       return this.slice(0,subString.length)==subString
     }
   }
}

addstartsWithToString();
"120000".startsWith1("1")

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/108421.html

相關(guān)文章

  • JavaScript中函數(shù)重載(Function overloading)

    摘要:說明中沒有真正意義上的函數(shù)重載。先看第一種辦法,通過對(duì)象來實(shí)現(xiàn)對(duì)象,是函數(shù)內(nèi)部的一個(gè)類數(shù)組對(duì)象,它里面保存著調(diào)用函數(shù)時(shí),傳遞給函數(shù)的所有參數(shù)。 說明 JavaScript 中沒有真正意義上的函數(shù)重載。 函數(shù)重載 函數(shù)名相同,函數(shù)的參數(shù)列表不同(包括參數(shù)個(gè)數(shù)和參數(shù)類型),根據(jù)參數(shù)的不同去執(zhí)行不同的操作。 我們舉個(gè)例子看看 function overload(a){ conso...

    inapt 評(píng)論0 收藏0
  • Jquery與Bootstrap實(shí)現(xiàn)后臺(tái)管理頁面增刪改查功能

    摘要:使用與實(shí)現(xiàn)了一個(gè)比較簡單但功能齊全的增刪改查功能的后臺(tái)管理頁面,雖然只是一個(gè)頁面,但麻雀雖小五臟俱全,常用的功能都用到了,本例用原生的與配合使用,不考慮的重構(gòu)性及打包,該例子零耦合,開箱即用。相關(guān)文章實(shí)現(xiàn)雙擊內(nèi)容變?yōu)榭删庉嫚顟B(tài) 使用jquery與bootstrap實(shí)現(xiàn)了一個(gè)比較簡單但功能齊全的增刪改查功能的后臺(tái)管理頁面,雖然只是一個(gè)CRUD頁面,但麻雀雖小五臟俱全,JS常用的功能都用到...

    yankeys 評(píng)論0 收藏0
  • TypeScript學(xué)習(xí)6-函數(shù)

    摘要:類型聲明中的函數(shù)定義,需要聲明參數(shù)和返回值的類型。其中隱藏有一個(gè)點(diǎn)類型推斷,箭頭函數(shù)沒有聲明返回值類型,這里編譯器不會(huì)報(bào)錯(cuò),因?yàn)樗梢酝茢喑龇祷刂殿愋汀? 引言 TypeScript中的函數(shù)和JavaScript中的函數(shù),和其他特性相比,是相差不大的。 這里會(huì)補(bǔ)充一點(diǎn)進(jìn)階知識(shí)。 函數(shù)相關(guān)的知識(shí)點(diǎn) 下面列舉一些TypeScript中函數(shù)相關(guān)的知識(shí)點(diǎn)。 類型聲明 TypeScript中的函...

    fuyi501 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<