【问题标题】:Object Orientated Javascript / Variable declarations / Performance面向对象的 Javascript / 变量声明 / 性能
【发布时间】:2011-08-19 10:53:15
【问题描述】:

所以我有一个相当大的面向对象的 javascript 类,有大约 120 个函数(很多 getter 和 setter)。其中一些函数的变量基本上是常量。

我想知道的是,我是否应该在对象的全局范围内声明这些变量,以便每次运行函数时都不必重新声明变量?

下面是一个示例函数。 this.displayContacts 运行了多次(并且总是在对象中运行),所以在这种情况下,在函数内声明“codes”对象没有意义吗?

function orderObject() {

  this.displayContacts = function() {
    var codes  = {'02':'02','03':'03','07':'07','08':'08'};
       // do something with codes
  };

}

那么,在性能方面,这会更好吗?

function orderObject() {
var codes  = {'02':'02','03':'03','07':'07','08':'08'};
  this.displayContacts = function() {
    // do something with codes.
  };

}

我的另一个担忧是,如果我最终在主 orderObject 中包含大量全局变量/对象,这是否会比每次都简单地重新声明变量对性能造成更大的影响?

【问题讨论】:

  • 在开始更改之前,我希望获得有关垃圾收集和任何全局范围问题的建议。这里有大约 3400 行代码,所以需要一些时间,哈哈。

标签: javascript performance oop


【解决方案1】:

绝对。

function MyClass() {
   this.somevar = ''; // instance scoped variable
};

MyClass.CODES = {'02':'02'...}; // 'Class' scoped variable; one instance for all objects

MyClass.prototype.instanceMethod = function(){
  // 'this' refers to the object *instance*
  // it can still use MyClass.CODES, but can also account for variables local to the class
}

CONSTANT 在 java-talk 中可以说是“静态的”。如果您的codes 对类(以及应用程序的其余部分)是全局的,那么您将通过这种方式节省大量开销——只需定义一次对象。请注意,对于函数不需要对特定于类实例的变量进行操作的情况,您也可以使用“静态”类级方法。

除非你的应用真的很强大,否则性能优化可能不会让它明显更快。但这并不意味着 OO 设计不值得——如果您打算以面向对象的方式使用 javascript,那么使用好的 OO 原则并不太难,也绝不是一个坏主意。

【讨论】:

  • 感谢您的洞察力。我注意到您使用了prototype.instanceMethod,那么这是否意味着MyClass.prototype.displayContacts?还是在函数内部 this.prototype.displayContacts?使用 .prototype 有什么好处?我对此也有点困惑:p
  • @benno -- 看看这个问题:stackoverflow.com/questions/4650513/…
  • 谢谢。目前我不确定这些方法的原型是否会产生很大的不同,因为只有一个对象调用,但是,我打算将它分成更易于管理的块(即订单对象和产品对象),所以我猜当我有多个产品对象时,原型会更有益。为此干杯!将节省大量性能!
  • 更好的方法是使 CODES 成为原型的属性,以便实例可以通过 this.CODES 访问它。
【解决方案2】:

我会说,如果您有在多个地方使用的东西,那么它应该成为您的对象的属性,这样就不必每次都重新声明它。如果该常量必须更改,它还有助于使对象的维护更容易。然后,您只需在一个地方更改它,而不必寻找所有使用它的位置。

不要重复自己。

【讨论】:

  • 谢谢 :) 我想我会尽可能走这条路
【解决方案3】:

JavaScript 中的垃圾收集依赖于浏览器,大多数现代浏览器都能很好地处理它。如果您继续使这些全局化,您可能会看到性能略有提高,这仅仅是因为它不是每次都执行该行代码。但是,我无法想象通过在类上创建这些静态属性来显着提高性能,但如果它们不改变,那么它会更有意义。

【讨论】:

  • 谢谢。是的,我不太确定垃圾收集将如何处理拥有许多全局范围变量而不是非全局变量。我只是尽可能地优化,因为一段时间后它会有点滞后。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
相关资源
最近更新 更多