扩展函数javascript的功能

时间:2015-05-22 14:52:41

标签: javascript jquery

我有一个声明如下的函数:

    function Plugin(option) {
       //logic here
    }
    $.fn.validator = Plugin

我需要用一些逻辑扩展这个函数,以便它做更像这样的事情:

    function Plugin(option) {
       if (myvariable == true)
       {
           //seperate logic
           return;
       }
       //logic here
    }

诀窍是我需要动态地将if语句添加到函数中,具有Plugin函数的代码会经常更新,并且我不想在每次文件更改时重新添加该逻辑。到目前为止,我只是使用所有逻辑创建整个函数,并用它替换旧函数。但这似乎浪费了很多代码。我希望有一种方法可以简单地合并它们,所以我试过了。

    function Plugin(option) {
       //logic here
    }
    function extendedPlugin(option) {
       //seperate logic here
    }
  $.fn.validator = $.extend(Plugin, extendedPlugin);
    //or
  $.fn.extend($.fn.validator, extendedPlugin)

我在底部尝试了几种不同的逻辑但是它每次只返回第一个函数,有没有办法合并它们,因为函数在技术上是对象不是吗? 我想我可能需要对原型做一些事情,但我对它们的理解仍然非常有限。

3 个答案:

答案 0 :(得分:3)

如果Plugin直接写在某些第三方代码中,您可以重命名并替换旧函数:

var OldPlugin = Plugin;
Plugin = function(option)
{
    if (myvariable == true)
    {
        //seperate logic
        return /* anything? */;
    }
    return OldPlugin.apply(this, arguments);
}

当然,任何指定的OldPlugin引用也必须替换:

$.fn.validator = Plugin; // After redefining "Plugin"

如果Plugin没有直接写在任何地方,但只是通过$.fn.validator调用,那么我会保留原始函数,只需将新函数分配给$.fn.validator,从那里你可以调用原始的Plugin函数。

答案 1 :(得分:1)

是否有理由不能从扩展函数中调用旧函数?

function Plugin(option) {
   //logic here
}
function extendedPlugin(option) {
   //seperate logic here
   // then call Plugin?
   return Plugin.call(this, option);
}

如果您需要新功能具有原始名称,您可以改为执行@Siguza回答

答案 2 :(得分:0)

我认为如果你使用JsonNode它会更容易 尝试这样做

function plugin(option){
   option.execute();
}

$.fn.validator = Plugin;

以这种方式实施

var process1 = {
       "execute":function(){
           alert('hello proccess #1');
       }
      };
var process2 = {
       "execute":function(){
           alert('hello process #2');
       }
      };

$.fn.validator(process1);
$.fn.validator(process2);

或者

if(myvariable){
     $.fn.validator(process1);
}else{
    $.fn.validator(process2);
}