2011-08-19 40 views
1

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

什么我不知道,是我应该在对象的全局范围内声明这些变量,所以每次运行该功能时它时不必重新声明变量?

一个示例函数是下面。 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里面,那将是一个性能损失的不仅仅是简单地重复声明每次变量?

+0

你试过了吗? –

+0

在我开始改变它之前,我想要收集有关垃圾收集和任何全球范围问题的建议。 Theres〜3400行代码都在这里,所以它需要一段时间的大声笑。 – Benno

回答

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

除非你的应用程序是非常结实,性能优化可能不会使其明显加快。但是,这并不意味着面向对象的设计是不值得的 - 而如果你要以面向对象的方式使用JavaScript,那么使用好的面向对象的原则并不难,也不是一个坏主意。

+0

感谢您的洞察力。我注意到你使用了prototype.instanceMethod,那么这是否意味着MyClass.prototype.displayContacts?或者在函数内部,this.prototype.displayContacts?使用.prototype有什么好处?我一直有点困惑,以及:p – Benno

+0

@benno - 看看这个问题:http://stackoverflow.com/questions/4650513/why-is-javascript-prototyping/4650576#4650576 – hvgotcodes

+0

谢谢你的。目前我不确定原型方法是否会产生很大的变化,因为只有一个对象的调用,但是我打算将它分解为更易于管理的块(即,订单对象和产品对象),所以当我有多个产品对象时,原型会更有利于我的猜测。为此欢呼!将节省很多表现! – Benno

1

我要说的是,如果您有您正在使用在多个地方的东西,它应该成为你的对象的属性,使之不必每次都重新声明。如果这个常数必须改变,它也将有助于使对象的维护更容易。然后你只能在一个地方改变它,而不必搜寻你使用它的所有位置。

不要重复自己。

+0

谢谢:)我想我会在可能的情况下沿着这条轨道走下去 – Benno

1

垃圾收集在JavaScript依赖于浏览器和多数现代浏览器处理它相当不错。如果继续前进并使其成为全局的,那么您可能会看到性能略有提高,因为它并不是每次都执行该代码行。然而,我无法想象通过在课堂上使用这些静态属性来显着提高性能,但如果它们没有改变,那么它会更有意义。

+0

谢谢你。是的,我不太确定垃圾收集如何处理拥有许多全局范围变量而非非全局变量。我只是想尽可能多地进行优化,因为在一段时间之后,它会有点迟缓。 – Benno