2012-05-13 10 views
1

可能性のある重複オブジェクト:
Javascript: Module Pattern vs Constructor/Prototype pattern?クラスエミュレーション - 機能対モジュールのパターンは

私はJavaScriptでクラスのエミュレーションを使用します。これは好みです。

私はモジュールパターンを使用していましたが、単純な関数オブジェクトを使用することを検討しています。パブリックとプライベートのメンバー変数と関数を作成できます。

Hereクラスをエミュレートする機能オブジェクトの例である:

var input = document.getElementById('input'); 
var output = document.getElementById('output'); 

function test() 
{ 
    var private_var = 'private_var'; 
    var private_func = function(){ return 'private_func';}; 
    var my = {}; 
    my.public_var = 'public_var'; 
    my.public_func = function(){ return 'public_func';}; 
    return my; 
} 

var object_test = new test(); 

alert('| ' + object_test.public_var); 
alert('| ' + object_test.private_var); 

alert('| ' + object_test.public_func()); 
alert('| ' + object_test.private_func()); 

​ 

Hereクラスをエミュレートするモジュールパターンの一例です。

主な違いは何ですか?暗黙のグローバルを明示的にする機能の他に、何かありますか?

+0

モジュールはシングルトンであり、もう1つはシングルトンではありません。 –

+0

http://stackoverflow.com/questions/3790909/javascript-module-pattern-vs-constructor-prototype-pattern – c69

+0

@私のオブジェクトのマットはシングルトンなので、これは知っておくと良いです...一般的に –

答えて

0

私の主な問題は、あなたのtest()関数はまだnewキーワードなしで呼び出すことができると信じています。この場合、 'this'の値は呼び出し先のコンテキスト(globally) test()内部クロージャに渡され、グローバル名前空間を汚染するなどの望ましくない影響や、それぞれの値が互いに上書きされるなどの望ましくない結果を引き起こします。通常の関数としてコンストラクタ関数を呼び出すと、インタプリタはあなたに警告しません。あなたのコードが優れたオーディエンスと共有されることを意図しておらず、コンストラクターのTest()や通常の関数のtest()など、コンストラクター関数の命名規則を使用している場合でも、安全です。 これは、return文にすべての「public」メンバを定義するように強制するなど、いくつかの規律を守るのにも役立ちます。すべてが隣接し、クリーンファサードとして機能します。これは大きなコードベースでは面白いです。

+0

良い点私は新しいものとの使用を考慮していなかった。 –

1

「機能オブジェクト」が意味するものを誤解しているかもしれませんが、これらのパターンはわかりましたが、実際には交換できません。

"モジュールパターン"は、必要に応じてメソッドとプロパティを持つ単一のオブジェクトを定義するためのものです。このように、モジュールはクラスではない、

var Module = { prop: 'prop' }; 
alert(Module.prop); 

しかし:この良い例がMathで、カスタムモジュールの簡単な例は、単にObjectインスタンスです。それらを使用するためにnew Mathに電話する必要はありません。彼らのメソッド(Math.abs())を呼び出すか、プロパティを取得/設定するだけです(Math.PI)。

ファンクションオブジェクト」 - つまり、コンストラクタを意味するものは、JavaScriptが持つ「クラス」定義に最も近い概念です。 Object,String,Array。これらと他は、新しいインスタンスを作成するために定義されたコンストラクタです。あなたが与えた

スニペットは確かにコンストラクタに修正することができます。

// common-practice: constructors are named in PascalCase 
function Test() 
{ 
    var private_var = 'private_var'; 
    var private_func = function(){ return 'private_func';}; 

    this.public_var = 'public_var'; 
    this.public_func = function(){ return 'public_func';}; 
} 

var object_test = new Test(); 

また、これらのパターンは必ずしもも、相互に排他的ではありません。モジュールのようにコンストラクタを処理することで、「静的」なようなメンバを定義することができます。

関連する問題