4

所以我一直在做一些类似于 JavaScript 的类的东西,比如

MyClass = function()
{
   var x;

   this.sayX = function()
   {
      alert(x);
   }
}

但我也见过

MyClass = function()
{
   this.x = 0;
}

MyClass.prototype.sayX = function()
{
   alert(this.x);
}

最大的问题是,我是否仍然在今天的 JavaScript 引擎中浪费内存空间,或者他们是否能够看到我的方法中的重复并优化它们?我问的原因是因为我宁愿进行适当的数据隐藏,而不必在所有内容前加上“this”。

4

2 回答 2

5

第一个的内存占用总是更大。将其prototype视为所有实例都可以使用的共享方法包。它是有效的,因为您不会为每个实例创建一个新函数,而是重用内存中已经存在的方法。

好消息是您展示的两种方式可以结合使用。

MyClass = function () {
   var x;
   // public method with access 
   // to private variables
   this.sayX = function () {
      alert(x);
   };
}
// method that doesn't need access to private variables
MyClass.prototype.sharedMethod = function () {
   // ...
}

但就您处理小型代码库而言,您不应该担心内存使用情况。您甚至可以使用类似的模式

// everything will be created for every
// instance, but the whole thing is nicely
// wrapped into one 'factory' function
myClass = function () {
   // private variables
   var x;

   // private methods
   function doSomethingWithX() {}

   // public interface
   return {
     sayX: function () {
       alert(x);
     },
     publicMethod: function () { .. },
     // ...
   };
};

注意,我特意把 myClass 改成了小写,因为它不再是构造函数,new调用时也不需要使用了!


更新- 第三种模式非常适合您的需求:

MyClass = function (x, y, whatever) {
   this._init.apply(this, arguments);
}

// The prototype creates a scope for data hiding.
// It also includes a constructor function.
MyClass.prototype = (function () {
   var x; // private
   return {
     _init: function (x_in) {
       x = x_in;
     },
     sayX: function () {
       alert(x);
     },
     // ...
   };
})();
于 2010-11-07T09:10:10.690 回答
0

稍后重温这一点,但事实证明 V8 足够聪明,它不会在第一种方法中创建该函数的多个实例。去隐藏课程:D

http://www.youtube.com/watch?v=hWhMKalEicY

于 2012-04-23T04:25:44.960 回答