首页 > 编程笔记 > JavaScript笔记 > JS函数
阅读:86
JS泛型函数
JavaScript 具有动态类型语言的部分特点,如用户不用关心一个对象是否拥有某个方法,一个对象也不限于只能使用自己的方法——使用 call 或 apply 动态调用,可以使用其他对象的方法。这样该方法中的 this 就不再局限于原对象,而是被泛化,从而得到更广泛的应用。
泛型函数(Uncurry)的设计目的是:将泛化 this 的过程提取出来,将 fn.call 或 fn.apply 抽象成通用的函数。
下面将 Array.prototype.push 原型方法进行泛化,此时 push 函数的作用与 Array.prototype.push 一样,但不局限于操作 Array 对象,还可以操作 Object 对象。
首先,调用 push(obj, [3,4,5]);,等效于以下原始动态调用的方法。
泛型函数(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,4,5]);即为:
Array.prototype.push.apply(obj, [3,4,5]);实际上,上面代码使用了两个 apply 动态调用,实现逻辑思路的两次转换。
所有教程
- socket
- Python基础教程
- C#教程
- MySQL函数
- MySQL
- C语言入门
- C语言专题
- C语言编译器
- C语言编程实例
- GCC编译器
- 数据结构
- C语言项目案例
- C++教程
- OpenCV
- Qt教程
- Unity 3D教程
- UE4
- STL
- Redis
- Android教程
- JavaScript
- PHP
- Mybatis
- Spring Cloud
- Maven
- vi命令
- Spring Boot
- Spring MVC
- Hibernate
- Linux
- Linux命令
- Shell脚本
- Java教程
- 设计模式
- Spring
- Servlet
- Struts2
- Java Swing
- JSP教程
- CSS教程
- TensorFlow
- 区块链
- Go语言教程
- Docker
- 编程笔记
- 资源下载
- 关于我们
- 汇编语言
- 大数据
- 云计算
- VIP视频