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

JavaScript 泛型函數(shù)

提問人:劉團圓發(fā)布時間:2020-11-25评论0

■知識點

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

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

■實例設計 

【實現(xiàn)代碼】

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

    var self = this; 

    return function()  {

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

    }

};

【應用代碼】

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

    //泛化 Array, prototype.push

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

    var obj = {};

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

    for(var i in obj)

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

【逆向解析】

簡單逆向分析一下泛型函數(shù)的設計思路。

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

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

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

push = function (){

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

}

最后,調用"push(obj,[3,4,5]);",代碼進行如下邏輯轉換。

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

即為:

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

實際上,上面的代碼使用了兩個apply動態(tài)調用,實現(xiàn)邏輯思路的兩次翻轉。

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

相關視頻回答
回復(0)
X
返回頂部
付费复制

付费获取七天复制权限

限时特价:2.88元/篇原价:10元
联系客服

扫码关注公众号,发送私信联系客服.

微信扫码关注,联系客服

联系客服QQ:2845411722

恭喜您,操作成功,可以复制了

3秒后关闭
X