2012-05-02 5 views
18

私はちょっと深くJavascriptを理解しようとしています。'static'として 'new'キーワードを使用するJavascript関数式を考えるのは正しいですか?

私は1つしか必要ではない、コンストラクタを必要としない、またはインスタンス化する 'クラス' gameDataを作成しました。

だから私はそう...「新しい」キーワードは、それがインスタンス化と静的クラスLIKEそれが利用できるようにすることはできませんことを認識

var gameData = new function() { 

    //May need this later 
    this.init = function() { 
    }; 

    this.storageAvailable = function() { 
     if (typeof (Storage) !== "undefined") { 
      return true; 
     } 
     else { 
      return false; 
     } 
    }; 
} 

は、C#でなるようにそれを作成しました。

私はこれを正しく考えていますか?静的なものとして?

+3

オブジェクトのインスタンスが1つだけ必要な場合は、コンストラクタを使用する理由は何ですか? – RobG

+0

あなたの質問がわかりません。基本的なオブジェクトリテラルとは対照的に、私はこの方法で作成したので、私はプライベートとパブリックのプロパティとメソッドを持つことができました。 –

+0

関連:http://stackoverflow.com/questions/17008086/no-ways-to-have-class-based-objects-in-javascript/17008693#17008693 –

答えて

22

それはまだあなたの「匿名」機能を指し示すconstructor性質を持っているので、いいえ、それは静的ではありません。あなたの例では、 "クラス"(実際にはインスタンス)が実際には "静的"でないように、2番目のオブジェクトを再インスタンス化するのに

を使用できます。あなたは基本的にはで、コンストラクタをに漏らしており、おそらくそれにバインドされているデータです。また、役に立たないプロトタイプオブジェクト(gameData.constructor.prototype)が作成され、プロトタイプチェーンgameDataに挿入されますが、これはあなたが望むものではありません。

代わりに、あなたは

  • Daff's answerのように)1つの単純なオブジェクトリテラルを使用する場合があります。つまり、コンストラクタ、クロージャスコープのプライベート変数(あなたはとにかくnoneを使用しています)およびno(カスタム)プロトタイプを持たないことを意味します。
  • (暴露)モジュールパターン(jAndy's answerのように)。クロージャスコープの変数を作成するにはIIFEがあり、あらゆる種類のオブジェクトを返すことができます。
  • 後で(必要に応じて)インスタンス化することができ、常に同じシングルトンオブジェクトを生成する実際のコンストラクタ(「クラス」)。

これはシングルトンパターンは次のようになります。あなたがGameDataのインスタンスを1つだけ持っているのでしかし

function GameData() { 
    if (this.constructor.singleton) 
     return this.constructor.singleton; 
    else 
     this.constructor.singleton = this; 

    // init: 
    // * private vars 
    // * public properties 
    // ... 
} 
GameData.prototype.storageAvailable = function() { 
    if (typeof (Storage) !== "undefined") { 
     return true; 
    } 
    else { 
     return false; 
    } 
}; 

var gameData = new GameData(); 
var gameData2 = new GameData(); 
gameData === gameData2 === GameData.singleton; // true 

、プロトタイプはかなり無駄です。それは継承で面白くなるだけです。

12

クラスは、ECMAscriptには、オブジェクトしかありません。

newを使用して関数を呼び出すときは、コンストラクタ関数と呼びます。この関数は、終了したら新しいオブジェクトを幾分自動的に返します。 this(その新しく作成されたオブジェクトを参照する)を使用してそのオブジェクト内に格納されたデータは、そのオブジェクトのプロパティとして返されます。それに加えて、newは、コンストラクタというプロパティをこの関数に正確に設定します。

var gameData = (function() { 
    var public = { }, 
     private = { }; // any private data can get stored here 

    //May need this later 
    public.init = function() { 
    }; 

    public.storageAvailable = function() { 
     if (typeof (Storage) !== "undefined") { 
      return true; 
     } 
     else { 
      return false; 
     } 
    }; 

    return public; 
}()); 

これはファクトリパターンシングルトンパターンと呼ばれる次のようにあなたのケースでは

、あなたも本当にnewの使用を必要としない、簡単にあなたのコードを再記述することができ,モジュールパターンなどがあります。私は何を探していることは、単純なJavaScriptオブジェクトであると考え

+0

ありがとう!これは非常に興味深いですね。何か私が試して消化するためにもっと! :) –

+1

あなたはそれを "自己呼び出された匿名の工場"と呼ぶべきです。 – Bergi

+2

@toddv:ダグラス・クロフォードの「JavaScript:良い部分」は、ECMAscriptの継承、Object +プロトタイプに入るための非常に良いアドバイスと推奨です。 – jAndy

6

var gameData = { 
    //May need this later 
    init : function() { 
    }, 

    storageAvailable : function() { 
     if (typeof (Storage) !== "undefined") { 
      return true; 
     } 
     else { 
      return false; 
     } 
    } 
} 

あなたはプライベート変数を使用したい場合は、暴露のモジュールパターンのスタイルのラッパーを作成します。これはjAndyが提案どのような基本的に次のとおりです。

var gameData = (function() { 
    var private = 'private variable'; 

    return { 
     //May need this later 
     init : function() { 
     }, 

     storageAvailable : function() { 
      if (typeof (Storage) !== "undefined") { 
       return true; 
      } else { 
       return false; 
      } 
     } 
    } 
})(); 
+0

パブリックメソッドとプライベートメソッドとコンストラクタが必要だったので、私はこのルートには行きませんでした。そして、それはオブジェクトリテラルを使って達成することはできません...正しい? –

+2

プライベート変数の回答を更新しました。私は静的なクラスのコンストラクタが必要なのはなぜですか? – Daff

関連する問題