JavaScript 泛型函數(shù)
■知識(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的過程提取出來,將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)。
點(diǎn)擊加載更多評(píng)論>>