JS泛型函数

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,5]);,等效于以下原始动态调用方法
Array.prototype.push.apply(obj,5]);
其次,调用 Array.prototype.push.uncurry(); 泛型化后,实际上 push() 就是以下函数
push = function () {
    return Function.prototype.apply.apply(Array.prototype.push,arguments);
}
最后,调用 push(obj,5]);,代码进行以下逻辑转换。
Array.prototype.push.(Function.prototype.apply) (obj,5]);
即为:
Array.prototype.push.apply(obj,5]);
实际上,上面代码使用了两个 apply 动态调用,实现逻辑思路的两次转换。

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...