当前位置:  开发笔记 > 编程语言 > 正文

我可以在JavaScript中复制/克隆一个函数吗?

如何解决《我可以在JavaScript中复制/克隆一个函数吗?》经验,为你挑选了3个好方法。

我正在使用带有验证器插件的jQuery.我想用自己的一个替换"必需的"验证器.这很简单:

jQuery.validator.addMethod("required", function(value, element, param) {
    return myRequired(value, element, param);
}, jQuery.validator.messages.required);

到现在为止还挺好.这很好用.但我真正想做的是在某些情况下调用我的函数,以及其余的默认验证器.不幸的是,这结果是递归的:

jQuery.validator.addMethod("required", function(value, element, param) {
    // handle comboboxes with empty guids
    if (someTest(element)) {
        return myRequired(value, element, param);
    }
    return jQuery.validator.methods.required(value, element, param);
}, jQuery.validator.messages.required);

我查看了验证器的源代码,并且"required"的默认实现在jQuery.validator.messages.required中定义为匿名方法.所以没有其他(非匿名)引用我可以使用的函数.

在调用addMethod并通过该引用调用默认验证器之前,在外部存储对该函数的引用没有任何区别.

我真正需要做的是能够按值而不是通过引用复制默认的必需验证器函数.但经过相当多的搜索,我无法弄清楚如何做到这一点.可能吗?

如果不可能,那么我可以复制原始功能的来源.但这会产生维护问题,除非没有"更好的方法",否则我宁愿不这样做.



1> Georg Schöll..:

在调用addMethod并通过该引用调用默认验证器之前,在外部存储对该函数的引用没有任何区别.

这正是应该工作的.

jQuery.validator.methods.oldRequired = jQuery.validator.methods.required;

jQuery.validator.addMethod("required", function(value, element, param) {
    // handle comboboxes with empty guids
    if (someTest(element)) {
        return myRequired(value, element, param);
    }
    return jQuery.validator.methods.oldRequired(value, element, param);
}, jQuery.validator.messages.required);

这也应该有效:(问题this解决了)

var oldRequired = jQuery.validator.methods.required;
jQuery.validator.addMethod("required", function(value, element, param) {
    // handle comboboxes with empty guids
    if (someTest(element)) {
        return myRequired(value, element, param);
    }
    return oldRequired.call(this, value, element, param);
    // return jQuery.oldRequired.apply(this, arguments);
}, jQuery.validator.messages.required);



2> xavierm02..:
Function.prototype.clone = function() {
    var fct = this;
    var clone = function() {
        return fct.apply(this, arguments);
    };
    clone.prototype = fct.prototype;
    for (property in fct) {
        if (fct.hasOwnProperty(property) && property !== 'prototype') {
            clone[property] = fct[property];
        }
    }
    return clone;
};

唯一不好的是原型没有被克隆,所以你无法真正改变它...我正在研究克隆任何类型的对象的方法,我只剩下RegExp了.所以我明天可能会编辑并放入整个代码(如果只将它用于函数和对象,那么这些代码很长并且没有优化.

并评论其他答案,使用eval()完全是愚蠢的,并且太长,而且Function构造函数有点相同.Literrals要好得多.并且包括JQuery只是为了它,而且如果它不能正常工作(我认为它没有)并不是你能做的最聪明的事情.



3> PicoCreator..:

这是一个更新的答案

var newFunc = oldFunc.bind({}); //clones the function with '{}' acting as it's new 'this' parameter

然而.bind是JavaScript的一个新功能,但有一个Mdn的解决方法

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind

此外,它不会克隆功能附加属性.

注意:正如@gsnedder所指出的那样:绑定语句,提供"this"参数(上面的空白{}).无论是否通过apply()/ call()函数覆盖,都将持续执行该函数的任何调用.

根据您的处理方式,这可以用于您的优势或劣势.

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有