2017-04-24 11 views
1

質問:以下の2つの例の結果オブジェクトobjには違いがありますか?コンストラクタとクロージャを使用してオブジェクトを作成する

閉鎖例:

var myClosure = function(paramId) { 
    return { 
    Id : paramId, 
    getId : function() {console.log(this.Id)}, 
    setId : function(sId) {this.Id = sId} 
    }; 
} 
var obj = myClosure(2); 
obj.getId();//outputs 2 
obj.setId(5); 
obj.getId();//outputs 5 

コンストラクタの例:

var MyConstr = function(Id) 
{ 
    this.Id = Id; 
    this.getId = function() { console.log(this.Id)}; 
    this.setId = function(sId) {this.Id = sId}; 
} 
var obj = new MyConstr(2); 
obj.getId();//outputs 2 
obj.setId(5); 
obj.getId();//outputs 5 

私はそれがその本来の目的であるから、オブジェクトを作成するコンストラクタを使用することがベストプラクティスであることを理解し、将来のコードリーダーの混乱を招くことになります。私の質問の目的は好奇心からです。最終結果に何らかの違いがありますか?オブジェクト、またはメモリの使用量、または何か他のものと一緒にいてください。

答えて

1

両方のオブジェクトは、同じ独自のプロパティとメソッドを持ちます。しかし、new MyConstrで構築されたものは[[proto]]参照MyConstr.prototypeを持ち、メソッドとプロパティを継承することができます。

それはあなたのケースでは違いはありませんので、あなたはそれらの機能を使用していないが、あなたは実際にはメモリ(これ以上の各インスタンスでメソッドをコピーしていない)と少しの時間を節約することになる、プロトタイプのsetIdgetIdを定義する必要があります(コンストラクタは少ない作業をするだろう)。

さらに、インスタンスを作成すると、instanceof演算子を使用できます。

0

この例では違いはありませんが、実際のアプリケーションでは異なる使用方法があります。

閉包の例は、[The Module Pattern] [1]または[The Revealing Module Pattern] [2]で通常使用されます。

[コンストラクタパターン] [3]および[プロトタイプパターン] [4]パターンでは、コンストラクタの例が通常使用されます。

プロトタイプパターンを使用することをお勧めします。現在、プロトタイプパターンを使用して、作成された新しいオブジェクトごとにgetIdsetId関数を追加しています。

getIdsetIdの代わりにJavaScriptゲッターとセッターを使用することも検討してください。

関連する問題