Javascript私有方法 - 内存影响是什么?

时间:2010-02-10 19:03:46

标签: javascript memory closures private-members

我正在研究一些代码,我试图在闭包中隐藏一些私有变量。问题是环境在内存方面受到了相当大的限制,所以我也关注保持类的总体足迹低。

与仅公开对象上的所有方法和变量相比,使用闭包隐藏私有实例变量和方法有什么影响?使用闭包的实例是否比不使用闭包的实例占用更多内存?如果是这样,我期望使用多少内存?

我的代码看起来像这样

function Foo() {
   // private variables
   var status = 3;
   var id = 4;
... 
...

   // private methods
   var privateMethod = function () {
      // do something awesome
   }
   ...

   // a whole bunch of these


   // public methods

   this.publicDriver =  function () {
        privateMethod();
   }
    .. a few more of these

};

对战

function Bar() {
   // only define public variables
   this.x = 1;
   this.y = 3;
}

Bar.prototype.method1 = function () { 
// blah;
}

....继续并定义所有其他方法。

4 个答案:

答案 0 :(得分:1)

好的,从我所看到的,使用闭包构造类为构造函数中定义的每个方法构造新的函数对象,而原型赋值方式创建一个由对象的所有实例共享的中心函数。然后根据对象解释中心实例以获取正确的实例变量引用。

我猜测闭包示例中定义的每个函数都会引用相同的堆栈帧。

尽管如此,在我的情况下,还有更多的物品漂浮着。

答案 1 :(得分:0)

以下链接显示了有关分析javascript函数的一些提示的信息,以查看有关其性能的信息:

http://ejohn.org/blog/function-call-profiling/

答案 2 :(得分:0)

查看these基准。虽然它们是继承基准,但它应该让你了解内存影响,因为它们中的一些使用闭包,而有些则没有。

答案 3 :(得分:0)

封闭在闭包中的变量可以在JavaScript中从闭包外部更新,这表明只存在一个变量副本。这意味着没有理由在JavaScript中使用闭包会产生任何重大的内存影响。

如果在创建闭包后冻结变量的值,那将是一个不同的故事,因为这意味着每个闭包必须有一个包含变量的私有副本。

即便如此,您仍应执行实际的基准检查: - )