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すべてのインスタンスが使用できるメソッドの共有パッケージと見なします。インスタンスごとに新しい関数を作成するのではなく、既にメモリ内にある既存のメソッドを再利用しているので効果的です。

良いニュースは、あなたが示した 2 つの方法を組み合わせることができるということです。

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 () { .. },
     // ...
   };
};

newmyClass はコンストラクター関数ではなく、呼び出し時に使用する必要がないため、意図的に小文字に変更したことに注意してください。


更新- ニーズに適した 3 番目のパターンがあります。

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 に答える