私は(質問のために簡略化され)、このような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:あなたは、私はそれが終了したら、私が直接、再びその範囲を参照するための本当の方法を持っていないので、私は、実際には全体の匿名関数の内部で名前空間を定義する必要があります信じて言っているから。私は今私が何をする必要があるかを知っていると思います。私は、その "新しい"キーワードで作業する別の方法があることを望んでいました。しかしそうではありません。
達成しようとしていることは何ですか?それは何も大したことではない非常にたくさんのコードのようです。 – Pointy
私は完全に異なる方法で解釈、表示、対話する必要があるさまざまなデータに柔軟に対応できるアプリケーションを作成しています。このような素敵なインターフェイスを設定することで、特定のオブジェクトのコード動作を後で変更したり、 "ObjectManager"などの他のオブジェクトを再作成しなくても簡単に変更できます。私は自分のコードが 'firstObject'または 'secondObject'を作成することを知っていると想定したくないので、ハードコーディングは私の目的ではありません。 – John