位置:首页 > 软件操作教程 > 编程开发 > JavaScript > 问题详情

JavaScript 泛型函数

提问人:刘团圆发布时间:2020-11-25

■知识点

    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动态调用,实现逻辑思路的两次翻转。

继续查找其他问题的答案?

相关视频回答
回复(0)
返回顶部