Javascript-在对象中存储函数-不好的做法?

Javascript-在对象中存储函数-不好的做法?,javascript,function,object,Javascript,Function,Object,将函数存储在对象中而不是仅仅定义它们(从而全局定义)是否被认为是糟糕的编码实践 考虑: 一, Foo.bar() vs 二, bar() 当然,第二个示例的代码可能会稍微少一些,但是当您开始获得大量函数时,它会变得混乱。 例如,我发现使用Game.update()而不是使用updateGame();或类似的。当你进入更深层次时,比如Game.notify.admin(id)等等,它会给你更漂亮的代码 将函数存储在对象中是否有任何缺点?首选第一种方法。通过这种方式,您可以明确定义函数的范围,而不是

将函数存储在对象中而不是仅仅定义它们(从而全局定义)是否被认为是糟糕的编码实践

考虑:

一,

Foo.bar()

vs

二,

bar()

当然,第二个示例的代码可能会稍微少一些,但是当您开始获得大量函数时,它会变得混乱。 例如,我发现使用
Game.update()
而不是使用updateGame();或类似的。当你进入更深层次时,比如
Game.notify.admin(id)
等等,它会给你更漂亮的代码


将函数存储在对象中是否有任何缺点?

首选第一种方法。通过这种方式,您可以明确定义函数的范围,而不是污染全局范围。使用第一种方法没有缺点。仅正面:-)


结论:始终使用第一种方法定义函数。第二个类似于90年代的javascript,让我们回到过去,让它平静下来,并使用适当的作用域。

在这种特定情况下,使用第一个。但是,如果您的Foo对象变得非常复杂,您可能希望使用另一种方法,这将使您有机会使用构造函数。而且,第一种方法有时在涉及函数范围时不是最好的:

function Foo(appName){
    this.name = appName;      
}

Foo.prototype.Bar = function(){
   alert(this.name)
}

var a = new Foo("baz");
a.Bar();

命名空间对象没有魔力,如果使用大量全局变量,也不一定会有任何问题。 使用“名称空间”对象的主要原因是减少全局变量名重复的可能性。第二个原因是为了方便起见,将类似的功能组合在一起,例如:

// Object example (suggested best practice):
// DOM functions are under myLib.dom
myLib.dom.someDOMFunction0;
myLib.dom.someDOMFunction1;

// Utility functions are under myLib.util
myLib.util.someUtilityFunction0;
myLib.util.someUtilityFunction1;
请注意,上述变量与类似的全局变量几乎有相同的重复机会:

// Global variable example:
myLib_dom_someDOMFunction0;
myLib_dom_someDOMFunction1;

myLib_util_someUtilityFunction0;
myLib_util_someUtilityFunction1;

当然,前者通常更受欢迎,因为它看起来更容易使用。我并不是建议您采用第二种方法(我使用第一种方法),只是指出,尽管创建大量全局变量存在问题,但所谓的“全局命名空间污染”被高估为一种危害。

否。如果有的话,全球数百万用户的框架不会这样做。否。正如你的问题已经指出的那样,这是避免全球污染的标准名称空间。为什么会不好?积极筑巢有一些不利因素。例如,将函数放在对象上“因为它更好”是愚蠢的。(将函数放在全局范围也是愚蠢的,但这不是我们要处理的,假设模块范围)。此外,将对象和函数嵌套在4层之外也是愚蠢的。理想情况下,您希望对象/方法链有一层或两层
foo.bar.baz()?或者只是为了减少全局变量的数量,以减少重复变量名的机会。“全球污染”还有其他负面影响吗?@RobG。有很多很好的理由尝试将全局变量的数量减少到零。@RobG这不是冲突,而是确保代码不会因破坏全局状态而意外破坏不变量。在大型项目中,您不需要全局状态,而依赖于全局状态未损坏的约定。@PhilOlson简单地将值存储在对象中比使用变量没有任何好处。如果需要模块化(模块化是个好主意),那么就有模块模式,它只公开那些需要公开的属性,并将其余的隐藏在单独的执行上下文中。检测到反模式。请使用原型,谢谢。你说得对@Raynos,在函数中声明函数的问题是每次初始化类时都会重新创建它。
// Object example (suggested best practice):
// DOM functions are under myLib.dom
myLib.dom.someDOMFunction0;
myLib.dom.someDOMFunction1;

// Utility functions are under myLib.util
myLib.util.someUtilityFunction0;
myLib.util.someUtilityFunction1;
// Global variable example:
myLib_dom_someDOMFunction0;
myLib_dom_someDOMFunction1;

myLib_util_someUtilityFunction0;
myLib_util_someUtilityFunction1;