2010-11-18 9 views
3

私は(質問のために簡略化され)、このような2つのオブジェクトを定義していますJavaScriptで新しいオブジェクトを動的に作成するためのより良い方法は?

:私はオブジェクトを作成するために私のメインのアプリケーションのためのインタフェースの一種として働くオブジェクトマネージャを持っている

var firstObject = function(){ }; 
firstObject.prototype.doSomethingFirstObjectsDo(); 

var secondObject = function(){ }; 
secondObject.prototype.doSomethingSecondObjectsDo(); 

次へ

var ObjectManager = function() 
{ 
    this.create = { 
     FIRST:firstObject, 
     SECOND:secondObject 
    }; 
}; 

ObjectManager.prototype.createObject = function(type) 
{ 
    return new this.create[type](); 
}; 

動的firstObjectsまたはsecondObjectsのいずれかを作成するために、オブジェクトマネージャを使用してメインアプリケーションの最後に例:

var MainApplication = function(options) 
{ 
    this.objectTypes = options.objectTypes; 
    this.objManager = new ObjectManager(); 
}; 

MainApplication.prototype.createObjects = function() 
{ 
    //Iterate through all the types this application needs to create 
    for (var type in this.objectTypes) 
    { 
     var dynamicallyCreatedObject = this.objManager.createObject(type); 
     //Do Something Else 
    } 
}; 

このアプローチは素晴らしいですが、作成できるオブジェクト "タイプ"ごとにコンストラクタ関数の名前を正式に定義する必要があるという欠点があります。

既に「正式に定義されている」「第3のオブジェクト」を作成したい場合は、元に戻ってObjectManagerの "thirdObject"のコンストラクタ関数への参照を追加する必要があります。

//Inside MainApplication 
for (var type in this.objectTypes) 
{ 
    var dynamicallyCreateObject = new [type](); //Invalid Syntax 
}; 

誰でも上の任意の考えを持っている:

理想的には、私は「のObjectManager」の必要性を削除し、単に動的に次のようにキーワード「新」でコンストラクタメソッドを呼び出すことができるようにしたいと思います「新しい」キーワードを使用してJavaScriptで異なるオブジェクトを動的に作成するより良い方法はありますか?


いくつかの初期のコメントへの対応:アプリケーション全体が匿名関数内で囲まれていることを私が言及している必要があります

(function(){ 
    //All of My Mentioned Code is Found Here 
    $(document).ready(function(){ 
     mainApp = window.mainApp = new MainApplication(options); 
    }); 
}); 

@casablanca:あなたは、私はそれが終了したら、私が直接、再びその範囲を参照するための本当の方法を持っていないので、私は、実際には全体の匿名関数の内部で名前空間を定義する必要があります信じて言っているから。私は今私が何をする必要があるかを知っていると思います。私は、その "新しい"キーワードで作業する別の方法があることを望んでいました。しかしそうではありません。

+1

達成しようとしていることは何ですか?それは何も大したことではない非常にたくさんのコードのようです。 – Pointy

+0

私は完全に異なる方法で解釈、表示、対話する必要があるさまざまなデータに柔軟に対応できるアプリケーションを作成しています。このような素敵なインターフェイスを設定することで、特定のオブジェクトのコード動作を後で変更したり、 "ObjectManager"などの他のオブジェクトを再作成しなくても簡単に変更できます。私は自分のコードが 'firstObject'または 'secondObject'を作成することを知っていると想定したくないので、ハードコーディングは私の目的ではありません。 – John

答えて

4

をDOM0ブラウザでグローバルwindowオブジェクトを使用するか、グローバルスコープへの独自の参照を作成し、それを使用してローカルに定義された変数をルックアップすることができます(私がしているかどうかはわかりません)。

var $global = this; 
var firstObject = function(){}; 

var objName = "firstObject"; 
var instance = new $global[objName]; 
+0

なぜそれは 'var instance = new firstObject();'よりも優れていますか?私は私が推測する元の質問を理解していない。 – Pointy

+0

@Pointy元の質問は、 'オブジェクト'の名前のリストをループしてそれらから新しいインスタンスを作成する方法を尋ねたので、 – Phrogz

+1

ああ、OK。私はまだここに全体のポイントを実際には持っていないと思いますが、あなたが言うことは私が推測する意味です。 – Pointy

7

この:あなたはプロパティにアクセスするために、外側のオブジェクトを必要とする以外

var dynamicallyCreateObject = new [type](); 

は、ほとんど正しいです。 、

var dynamicallyCreateObject = new window[type](); 

理想的には、彼らはあなた自身の名前空間内にあるべきで、その場合、あなたは似たような行うことができます:あなたのコンストラクタはグローバルである場合、あなたはwindowを使用することができ、私は理解と仮定

var dynamicallyCreateObject = new MyNamespace[type](); 
関連する問題