扩展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