在JavaScript中向函数添加函数的最佳实践是什么?

在JavaScript中向函数添加函数的最佳实践是什么?,javascript,Javascript,我有一个例子,我想有一个主js文件和一个调整大小的功能和特定的文件,可以添加工作负载的主文件,而不改变主文件和手动调用函数 假设我有一个对象文本 var App = { resize: function(){ // Code should be executed here }, addResize: function(){ // ? } } 我还需要一个函数向resize函数添加代码,该函数可以动态地将工作负载添加到resize函数(在窗口调整大小时调用该函数)

我有一个例子,我想有一个主js文件和一个调整大小的功能和特定的文件,可以添加工作负载的主文件,而不改变主文件和手动调用函数

假设我有一个对象文本

var App = {
  resize: function(){
    // Code should be executed here
  },
  addResize: function(){
    // ?
  }
}
我还需要一个函数向resize函数添加代码,该函数可以动态地将工作负载添加到resize函数(在窗口调整大小时调用该函数):

我想到的第一件事是将
addResize
中的匿名函数存储到一个数组中,并在resize函数中对其进行迭代,但这并不是最好的做法:

var App = {
  resizeFunctions = [];
  resize: function(){
    // iterate over resizeFunctions and call each one
    // here I define throttling/debouncing ONCE
  },
  addResize: function(fn){
    this.resizeFunctions.push(fn);
  }
}

window.onresize = App.resize();

App.addResize(fn1);
App.addResize(fn2);

有更好的方法吗?

您可以将对象文字视为数组

App["resize"] = function(){
  //Code goes here
}
__

两者都一样好。这些将更新
resize

如果您想添加一些新方法,那么同样的语法也可以使用

App["myNewMethod"] = new function(){
 //Code here
}
在OP评论后编辑

var oldFun = App["resize"];   // or may be store this in App itself
App["resize"] = function(){
    //Pre-processing 

    // Now call original resize method
    oldFun();   //If resize method used method argument then use oldFun.apply( this, arguments );


    //Post processing 
}

是否要覆盖现有函数? 然后你可以这样做:

App.addResize = function(){}
将函数作为属性传递给addResize,但不将其添加到属性中。你可以

App.addResize.newFunction = function(){ ... };

其中,
newFunction
是函数的名称

,因为您指的是一个函数,即调整大小函数,我假设您正在寻找函数重载:


如果您想将一组方法的功能扩展到不同的子对象,我将研究原型继承。

它允许您为每个子对象定义或重新定义父方法

我是否正确理解了这一点:您想从其他文件扩展对象?在一个文件中定义
App
,然后在另一个文件中定义属于
App
的函数?或者您想让
addResize()
在一个单独的文件中定义更多的事情吗?正确的答案将取决于以下几点:每个工作是否需要按照特定的顺序进行?这些函数是否需要访问应用程序“类”中的特定数据?它们通常是根据具体情况添加/删除的,还是一次性设置,以后所有对
resize()
的调用都以相同的方式工作?我希望不同的文件告诉应用对象在调用App.resize时应该做什么,而不必触摸定义应用的文件。但这是页面加载的一次性设置。有点像系统中的模块。所以,只有一个文件决定了
调整大小
的作用?它不是几个文件的组合?当窗口调整大小时,会调用App.resize,要做的工作应该通过调用addResize从外部定义,addResize会向App.resizen添加一个要执行的函数。实际上,这有点像是从addResize附加匿名函数。这是你要找的吗?这覆盖了原来的定义,对吗?我有点想用新代码扩展它。我知道你要去哪里,但出于性能原因,理想情况下,App.resize应该只在addResize生成的所有工作负载中调用一次。我似乎在interwebz上找不到.newFunction的任何文档,有人可以帮助吗?
newFunction
只是该方法的名称。这与
App.addResize[“newFunction”]
相同,感谢您提供的资源,但是App.resize如何存储每次调用App.resize时都应该调用的函数?检查我添加的链接是否对您有用。“更好”仅取决于您的需要。如果它对您有效,并且您觉得它将以这种方式使您的代码更具可读性和可维护性,而不会放弃,那么它可能会更好。根据resize函数的作用,您不必使用匿名函数重载函数。根据需要,您还可以使用可选参数值重载调整大小功能,并相应地管理该功能。
App.addResize = function(){}
App.addResize(function(){ ... });
App.addResize.newFunction = function(){ ... };