2016-06-13 1 views
1

私のプログラムの残りの部分から変数などを隠すために、明らかにしているモジュールパターンに "オブジェクトファクトリ"をカプセル化したいと思います。私のモジュールで作成されたオブジェクトは同じprototypeインスタンスを共有しますか?つまり、工場で新しいオブジェクトを作成するたびに新しいprototypeオブジェクトをメモリに作成していますか、またはすべてのオブジェクトが同じプロトタイプを共有/参照していますか?"オブジェクトファクトリ"をモジュールパターンでカプセル化すると、オブジェクトプロトタイプのメモリ消費量が増えますか?

var Factory = (function(){ 
 
    var uid_seed = 0; 
 
    function TestObject() { 
 
    this.size = 1; 
 
    this.name = "foo"; 
 
    this.uid = uid_seed++; 
 
    } 
 
    TestObject.prototype.getName = function() { 
 
    return "Name is: " + this.name; 
 
    }; 
 
    return { 
 
    testObject: function() {return new TestObject();} 
 
    } 
 
})(); 
 

 
var arr = []; 
 

 
for (var i = 1000; i--;) arr.push(Factory.testObject());

私はこのコードの最後の行の1000個のTestObjectオブジェクトを作成し、それらは各々がメモリを消費しているのプロトタイプを持っている:ここでは

は、私のコードの簡単な例であります?あるいはこれは、共有プロトタイプを使ってオブジェクトを作成するメモリ効率的な方法ですか?

答えて

3

はい、それらは同じプロトタイプを持っています。モジュールの初期化コードは1回だけ実行され、プロトタイプは1つだけ作成されます。また、すべてのインスタンスに対してuid_seed = 0を再評価するのではなく、すべてが異なるuidになると予想されます。

Object.getPrototypeOf(arr[0]) === Object.getPrototypeOf(arr[1])をチェックすることで簡単にテストできます。

+0

あなたは非常に明確に私に答え - 私が「テスト」へのあなたの方法は私のプロトタイプを変更する必要がないという事実が好きです。私はuid_seedの再評価についてのあなたのコメントを理解していません。チェックして、私が作成したそれぞれの 'TestObject'は、目的の' uid'を持っています。実際のコードでは、 'uid'を難読化して使用しています。ここにそれを含めるのは礼儀正しいものでした。しかし、私は何かを欠いていますか(あなたの意見など)?ありがとう! – Joshua

+0

@ジョシュア:はい、それぞれのオブジェクトには希望のuidがあります。 'TestObject'コンストラクタ(とそのプロトタイプ)と' uid_seed'変数は同じスコープにあります。どういうわけか、各オブジェクトが何度も再作成され、異なるプロトタイプを持つ別のクラスであったとすれば、 'uid_seed'初期化もそれぞれのオブジェクトに対して再実行され、各オブジェクトには'.uid' 0です。しかし、そうではありません。これは、コードがうまくいくかどうかをさらに証明するものです。 – Bergi

+0

素晴らしい!ありがとうございました。ケースが閉まった。 – Joshua

1

短い答えは:はい、同じプロトタイプを共有しています。

もう少し答えが「クラス」を1回だけ定義しているということです。直ちに呼び出された関数式を実行してFactoryオブジェクトを作成すると、関数が実行される唯一の時間となります。

これは、TestObjectTestObject.prototypeが1回生成されることを意味します。これをチェックする簡単な方法は、インスタンスのプロトタイプを修正し、それが他のインスタンスを変更するかどうかを確認することです。

var Factory = (function(){ 
 
    var uid_seed = 0; 
 
    function TestObject() { 
 
    this.size = 1; 
 
    this.name = "foo"; 
 
    this.uid = uid_seed++; 
 
    } 
 
    TestObject.prototype.getName = function() { 
 
    return "Name is: " + this.name; 
 
    }; 
 
    return { 
 
    testObject: function() {return new TestObject();} 
 
    } 
 
})(); 
 

 
var obj1 = Factory.testObject(); 
 
var obj2 = Factory.testObject(); 
 

 
// Original prototype function 
 
console.log(obj1.getName()); 
 
console.log(obj2.getName()); 
 

 
// Modify the prototype of the first 
 
obj1.constructor.prototype.getName = function() { 
 
    return "Changed function"; 
 
}; 
 

 
// Both objects are affected 
 
console.log(obj1.getName()); 
 
console.log(obj2.getName());

関連する問題