JavaScript 泛型函数
■知识点
JavaScript具有动态类型语言的部分特点,如用户不用关心一个对象是否拥有某个方法,一个对象也不必只能使用自己的方法,使用call或apply动态调用,可以使用别的对象方法,这样该方法中this 就不再局限于原对象,而是被泛化,从而得到更广泛的适用性。
泛型函数(uncurry)的设计目的:将泛化this的过程提取出来,将fn.call或fn.apply抽象成通用的函数。
■实例设计
【实现代码】
function.prototype.uncurry = function () {//泛型函数
var self = this;
return function() {
return Function.prototype•apply•apply(self, arguments);
}
};
【应用代码】
下面将Array.prototype.push原型方法进行泛化,此时push函数的作用与Array.prototype.push —样,但不仅局限于操作Array对象,还可以操作Object对象。
//泛化 Array, prototype.push
var push = Array.prototype.push.uncurry();
var obj = {};
push(obj, [3, 4, 5]); //可以把数组转换为类数组
for(var i in obj)
console, log (i); //输出类数组:{0: 3, 1: 4, 2: 5, length: 3}
【逆向解析】
简单逆向分析一下泛型函数的设计思路。
首先,调用”push(obj,[3,4,5]);"代码,它等效于如下原始动态调用的方法。
Array.prototype.push.apply(obj, [3, 4, 5]);
然后,调用"Array.prototype.push.uncurry();"泛型化后,实际上push()就是如下函数。
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动态调用,实现逻辑思路的两次翻转。
点击加载更多评论>>