位置:首頁(yè) > 軟件操作教程 > 編程開發(fā) > JavaScript > 問(wèn)題詳情

JavaScript 泛型函數(shù)

提問(wèn)人:劉團(tuán)圓發(fā)布時(shí)間:2020-11-25

■知識(shí)點(diǎn)

    JavaScript具有動(dòng)態(tài)類型語(yǔ)言的部分特點(diǎn),如用戶不用關(guān)心一個(gè)對(duì)象是否擁有某個(gè)方法,一個(gè)對(duì)象也不必只能使用自己的方法,使用call或apply動(dòng)態(tài)調(diào)用,可以使用別的對(duì)象方法,這樣該方法中this 就不再局限于原對(duì)象,而是被泛化,從而得到更廣泛的適用性。

    泛型函數(shù)(uncurry)的設(shè)計(jì)目的:將泛化this的過(guò)程提取出來(lái),將fn.call或fn.apply抽象成通用的函數(shù)。

■實(shí)例設(shè)計(jì) 

【實(shí)現(xiàn)代碼】

function.prototype.uncurry = function () {//泛型函數(shù) 

    var self = this; 

    return function()  {

        return Function.prototype?apply?apply(self, arguments);

    }

};

【應(yīng)用代碼】

下面將Array.prototype.push原型方法進(jìn)行泛化,此時(shí)push函數(shù)的作用與Array.prototype.push —樣,但不僅局限于操作Array對(duì)象,還可以操作Object對(duì)象。

    //泛化 Array, prototype.push

    var push = Array.prototype.push.uncurry();

    var obj = {};

    push(obj, [3, 4, 5]); //可以把數(shù)組轉(zhuǎn)換為類數(shù)組

    for(var i in obj)

        console, log (i); //輸出類數(shù)組:{0: 3, 1: 4, 2: 5, length: 3}

【逆向解析】

簡(jiǎn)單逆向分析一下泛型函數(shù)的設(shè)計(jì)思路。

首先,調(diào)用”push(obj,[3,4,5]);"代碼,它等效于如下原始動(dòng)態(tài)調(diào)用的方法。 

Array.prototype.push.apply(obj, [3, 4, 5]);

然后,調(diào)用"Array.prototype.push.uncurry();"泛型化后,實(shí)際上push()就是如下函數(shù)。 

push = function (){

    return Function.prototype.apply.apply(Array.prototype.push, arguments);

}

最后,調(diào)用"push(obj,[3,4,5]);",代碼進(jìn)行如下邏輯轉(zhuǎn)換。

Array.prototype.push. (Function.prototype.apply) (obj, [3, 4f 5]);

即為:

Array.prototype.push.apply(obj, [3, 4, 5]);

實(shí)際上,上面的代碼使用了兩個(gè)apply動(dòng)態(tài)調(diào)用,實(shí)現(xiàn)邏輯思路的兩次翻轉(zhuǎn)。

繼續(xù)查找其他問(wèn)題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部