Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
扩展javascript函数的功能_Javascript_Jquery - Fatal编程技术网

扩展javascript函数的功能

扩展javascript函数的功能,javascript,jquery,Javascript,Jquery,我有一个声明如下的函数: function Plugin(option) { //logic here } $.fn.validator = Plugin function Plugin(option) { if (myvariable == true) { //seperate logic return; } //logic here }

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

    function Plugin(option) {
       //logic here
    }
    $.fn.validator = Plugin
    function Plugin(option) {
       if (myvariable == true)
       {
           //seperate logic
           return;
       }
       //logic here
    }
我需要用一些逻辑来扩展这个函数,这样它就可以做类似这样的事情:

    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)
我在底部尝试了这种逻辑的几种变体,但每次它都只返回第一个函数,有没有办法合并它们,因为函数在技术上是对象,不是吗?
我想我可能需要对原型做些什么,但我对它们的理解仍然非常有限。

如果
插件直接用第三方代码编写,您可以重命名并替换旧函数:

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"

如果
插件
不是直接写在任何地方,而是只通过
$.fn.validator
调用,那么我会保持原始函数不变,只需为
$.fn.validator
分配一个新函数,您可以从那里调用原始的
插件
函数。

如果
插件
是直接用第三方代码编写的,您可以重命名和替换旧函数:

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"

如果
插件
不是直接写在任何地方,而是只通过
$.fn.validator
调用,那么我会保持原始函数不变,只需为
$.fn.validator
分配一个新函数,您可以从那里调用原始的
插件
函数。

有什么原因不能直接从扩展函数调用旧函数

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

如果您需要新函数具有原始名称,您可以改为执行@Siguza回答的操作

有什么原因不能直接从扩展函数调用旧函数吗

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

如果您需要新函数具有原始名称,您可以改为执行@Siguza回答的操作

我认为如果您使用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);


我认为如果您使用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);



你应该使用
.apply()
,而不是
.call()
,来处理特定的情况。我认为你应该
返回这个保持jqchaining@A.WolffOP提供了
返回
在他的代码中,我刚刚复制了它。@Siguza ya但是如果原始插件返回匹配的元素集,你应该做同样的事情,否则
返回会更相关,这是真的。是的,返回是伪代码。在这种情况下,实际返回没有意义。不过,这非常有效,在我的特定场景中,我不必将原始文件保存到“OldPlugin”变量中,我只添加了Plugin.apply(这是参数);在extendedPlugin和Overwrite验证器的结尾,但同样的概念谢谢!(很快就会接受)您应该使用
.apply()
,而不是
.call()
,来处理特定的情况。我认为您应该
返回这个保持jqchaining@A.WolffOP提供了
返回
在他的代码中,我刚刚复制了它。@Siguza ya但是如果原始插件返回匹配的元素集,你应该做同样的事情,否则
返回会更相关,这是真的。是的,返回是伪代码。在这种情况下,实际返回没有意义。不过,这非常有效,在我的特定场景中,我不必将原始文件保存到“OldPlugin”变量中,我只添加了Plugin.apply(这是参数);在extendedPlugin和Overwrite验证器的结尾,但同样的概念谢谢!(将很快接受)当以这种方式调用旧的时,
this
的值将不正确。@jfriend00发现得很好,我想需要apply()来保存它。编辑。
.apply()
接受数组作为第二个参数。如果要传递参数本身,则需要
.call()
。而且,您必须首先展示
extendedPlugin
是如何连接到jQuery的。目前的答案是不完整的。我更正了
.call()
-至于附加到jQuery,它在很大程度上与如何完成无关吗?像
$.fn.pluginName=extendedPlugin
这样的东西应该能起到作用吗?我不知道你怎么能说它无关紧要。这是解决方案的必需部分。
this
的值在以这种方式调用旧值时将不正确。@jfriend00发现得很好,我想需要apply()来保存它。编辑。
.apply()
接受数组作为第二个参数。如果要传递参数本身,则需要
.call()
。而且,您必须首先展示
extendedPlugin
是如何连接到jQuery的。目前的答案是不完整的。我更正了
.call()
-至于附加到jQuery,它在很大程度上与如何完成无关吗?像
$.fn.pluginName=extendedPlugin
这样的东西应该能起到作用吗?我不知道你怎么能说它无关紧要。这是解决方案的必要部分。此实现是软件开发中最常用的模式设计。它使它更开放,你可以动态地改变行为你不必对自己的答案发表评论,你只需编辑它并附加信息:)也就是说,我看不出这如何回答关于扩展函数的问题。这个实现是软件开发中最常用的模式设计。它使它更开放,你可以动态地改变行为你不必对自己的答案发表评论,你只需要edi