0

私は3つのjsファイルを持っています。

object.js には、次のオブジェクトが含まれています。

function User()
{
 //Some property
}

function Employee()
{
 // Some Property
}

...など

メソッド CreateInstance(objectname) を作成する必要がある Framework.js があります。

このメソッドを作成する必要があるのは、createinstance メソッドを使用する人が必要なインスタンスを持つ objectname を渡すだけでよいようにするためです。したがって、将来、object.js にオブジェクトが追加された場合、createinstance は、CreateInstance メソッドを変更することなく、ObjectName に基づいてそのオブジェクトのインスタンスを作成できるはずです。

function CreateInstance(objectName)
  {
  //logic for creating instance of object.
  }

それは可能ですか?

4

6 に答える 6

1

の 1 つの正当な使用eval

function CreateInstance(objectName) {
  return new (eval(objectName))();
}

objectName安全を確保したい場合は、それが単語でありeval(objectName)関数であることを確認するために、いくつかの検証を追加することができます。

于 2013-07-07T10:18:54.127 に答える
1

文字列を提供してインスタンスを作成したい場合(それが私があなたの質問を解釈する方法です)、いつでも使用できますeval

function CreateInstance(objectName) {
    return eval("new " + objectName + "()");
}
于 2013-07-07T10:19:59.343 に答える
1

以下は、ウィンドウ スコープで User と Employee が定義されている限り機能するはずです。

function CreateInstance(objectName)
{
    if (typeof window[objectName] == 'function') {
        return new window[name];
    }

    // return null or throw an error ...
}

var user = CreateInstance('User');
console.log(user instanceof User); // true

var employee = CreateInstance('Employee');
console.log(employee instanceof Employee); // true
于 2013-07-07T10:21:02.933 に答える
0

Factory Pattern のようなものを作ろうとしていると思います。それを行うにはさまざまな方法がありますが、上記のステートメントによると、少し間違っているようです。

Javascript は、関数がオブジェクト自体を表す関数ベースの言語です (つまり、クラスのような構造)。

関数を作成すると、すでにオブジェクトが作成されています。

new キーワードを使用して、いつでもオブジェクトを作成できます。

new キーワードを直接使用する理由は、「グローバルに考慮された言語」です。つまり、オブジェクトがシステム内でいつでも参照されていれば、どこからでもグローバルにアクセスできます。

于 2013-07-07T10:33:54.347 に答える