面向对象的Javascript/变量声明/性能
所以我有一个相当大的面向对象的javascript类,大约有120个函数(很多getter和setter)。其中一些函数的变量基本上是常量 我想知道的是,我是否应该在对象的全局范围内声明这些变量,这样每次函数运行时就不必重新声明变量了 下面是一个示例函数。this.displayContacts会运行多次(并且将始终在对象中运行),因此在这种情况下,在函数中声明“code”对象没有意义面向对象的Javascript/变量声明/性能,javascript,performance,oop,Javascript,Performance,Oop,所以我有一个相当大的面向对象的javascript类,大约有120个函数(很多getter和setter)。其中一些函数的变量基本上是常量 我想知道的是,我是否应该在对象的全局范围内声明这些变量,这样每次函数运行时就不必重新声明变量了 下面是一个示例函数。this.displayContacts会运行多次(并且将始终在对象中运行),因此在这种情况下,在函数中声明“code”对象没有意义 function orderObject() { this.displayContacts = func
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中包含大量全局变量/对象,那么这会比每次简单地重新声明变量更影响性能吗?当然
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中可以说是“静态的”。如果您的代码对类(以及应用程序的其余部分)是全局的,那么这样可以节省大量开销——只定义一次对象。注意,对于函数不需要对特定于类实例的变量进行操作的情况,也可以使用“静态”类级方法
除非你的应用真的很强大,否则性能优化可能不会让它明显更快。但这并不意味着OO设计不值得——如果您打算以面向对象的方式使用javascript,使用好的OO原则并不难,也不是一个坏主意。我想说,如果您在多个地方使用了某些东西,那么它应该成为对象的属性,这样就不必每次都重新声明。如果常数必须改变,这也有助于使对象的维护更容易。然后,您只在一个地方更改它,而不必查找您使用它的所有位置
不要重复自己的话。JavaScript中的垃圾收集取决于浏览器,大多数现代浏览器都能很好地处理它。如果您继续将这些代码全局化,您可能会看到性能略有提高,因为它不是每次都执行这行代码。然而,我无法想象通过在类上创建这些静态属性来显著提高性能,但是如果它们不改变,那么就更有意义了。在我开始改变之前,我需要关于垃圾收集和任何全局范围问题的建议。这里有大约3400行代码,所以需要一段时间。谢谢你的洞察力。我注意到您使用了prototype.instanceMethod,那么这是否意味着MyClass.prototype.displayContacts?或者在函数内部,this.prototype.displayContacts?使用.prototype有什么好处?我对此也有点困惑:p@benno--看看这个问题:谢谢你。目前,我不确定这些方法的原型化是否会有很大的不同,因为只有一个对象调用,但是,我打算将其拆分为更易于管理的块(即订单对象和产品对象),所以当我有多个产品对象时,我猜原型在那里会更有用。为此干杯!这将在赛道上节省大量性能!更好的方法是将代码作为原型的一个属性,这样实例可以通过this.code
访问它。谢谢。是的,我不太确定垃圾收集将如何处理有许多全局作用域变量而不是非全局变量的问题。我只是尽我所能地去优化,因为过了一段时间它会有点滞后。谢谢:)我想我会尽可能地沿着这条路走下去