2012-01-15 12 views
4

Snippet1を使用して定義された方法との違い:次の二つ

var box = function() {}; 

box.prototype.open = function { 
}; 

Snippet2:

var box = function() { 
     this.open = function() { 
     }; 
    } 

これら二つの間の任意の差、一つは良いですか?

答えて

5

boxはコンストラクタなので、new box()を実行しているとしますか?

もしそうなら...

  • 最初のバージョンはboxコンストラクタから作成されたすべてのオブジェクト間open機能を共有します。

  • 2番目のオブジェクトは、boxコンストラクタから作成されたすべてのオブジェクトに対して新しい関数オブジェクトを生成します。

このように、最初のメモリは2番目のメモリよりも効率的です。


最初のバージョン:

new box     box prototype   object prototype 
+--------------+   +--------------+   +--------------+ 
|    |   |    |   |    | 
|    |--------->| open func |--------->|    | 
|    |  /|    |   |    | 
+______________+ / +______________+   +______________+ 
        /
        /
    new box  /
+--------------+/
|    |/
|    |/ 
|    | 
+______________+ 

セカンドバージョン:

new box    box prototype   object prototype 
+--------------+   +--------------+   +--------------+ 
|    |   |    |   |    | 
| open func |--------->|    |--------->|    | 
|    |  /|    |   |    | 
+______________+ / +______________+   +______________+ 
        /
        /
    new box  /
+--------------+/
|    |/
| open func |/ 
|    | 
+______________+ 
+0

しかし、(明示的に言っていないので)2番目の方が何らかの理由でより適切です_非常に一般的な状況ではなく、各インスタンスごとに個別に関数を定義する必要があります。 – nnnnnn

+0

@nnnnnn:はい、良い点です。確かに、関数をコンストラクタで作成し、直接代入する有効な機会があります。 –

5

@amはない私は正しいです。最初の方法は効率的な方法です。 2番目の方法は、プライベート変数が必要な場合に便利です。

var box = function() { 
    var _message = "hello world"; 
    this.func2 = function(){ 
     console.log(_message); // prints hello world 
    } 
}; 

box.prototype.func1 = function() { 
    this.func2();    // prints hello world 
    console.log(_message);  // throws ReferenceError: _message is not defined 
}; 
+1

+1は、各オブジェクトに固有の機能を割り当てる有効なユースケースを提供するためのものです。 –