泛型函数(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 动态调用,实现逻辑思路的两次转换。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。