2025年3月23日 星期日 甲辰(龙)年 月廿二 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > JavaScript

JS泛型函数

时间:03-07来源:作者:点击数:90

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,4,5]);

即为:

  • Array.prototype.push.apply(obj, [3,4,5]);

实际上,上面代码使用了两个 apply 动态调用,实现逻辑思路的两次转换。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门