2016-05-11 11 views
0

私はクライアントで宣言された名前空間とクラスを持っています。実際、私はいくつかの名前空間で宣言された一連のクラスを持っています。私はちょうど私がページのロード時に "ドット付き" namespace.class名を含む文字列をサーバーから取得するときに、そのうちの1つのインスタンスを取得する必要があります。JavaScript:文字列名を持つオブジェクトを作成する方法

現在、私はそれを行うためにevalを使用しますが、これはメモリリークが発生するので、私は唯一のその名前を知ることで宣言したオブジェクトをインスタンス化する別の方法を見つけようとしています。 var obj = "myNamespace.myObjectName"();のようなものは明らかに機能しません。

window["myNamespace"] = {}; 
myNamespace.myObjectName = function() { /* blah */ }; 

var name = "myNamespace.myObjectName"; 
var obj = eval("new " + name + "()"); 

しかし、私はしたくないいくつかの理由のために/を使用することはできませんeval:私は、文字列変数としてオブジェクト名を持っている場合

は、私は、そのオブジェクトのインスタンスを作成するためにeval()機能を使用することができます。 evalを使用せずに名前でオブジェクトを作成するにはどうすればよいですか?

+0

私の状況では、その質問の回答は役に立ちません。重複しているとマークする前に注意深くお読みください。 – Alex

+1

あなたは 'name'変数の内容を制御しないので、文字列にドットを組み込む必要がありますか? –

+0

"myNamespace.myObjectName"()を呼び出すことはできません。質問をお読みください。 – Alex

答えて

1

name変数の内容を制御しないように聞こえるので、.が文字列の一部になっています。

したがって、.split()の文字列を名前部分に使用し、.reduce()を使用してベースオブジェクトからトラバースすることができます。

window["myNamespace"] = {}; 
 
myNamespace.myObjectName = function() { 
 
    this.foo = "bar" 
 
}; 
 

 
var name = "myNamespace.myObjectName"; 
 
var obj = newObjectFromStringPath(name); 
 

 

 
document.querySelector("pre").textContent = JSON.stringify(obj, null, 4); 
 

 

 
function newObjectFromStringPath(path, base) { 
 
    return new (name.split(".").reduce(function(obj, name) { 
 
    return obj != null ? obj[name] : null 
 
    }, base || window)) 
 
}
<pre></pre>

newObjectFromStringPathは、特に機能を標的とし、コンストラクタとしてそれを呼び出すようにコーディングされています。その機能の中のnewを単に削除するだけで、この作業を簡単に行うことができます。

+0

それは私が必要としていたものです。すでにテスト済みで、魅力的な作品です。ありがとうございました! – Alex

+0

ようこそ。それが助けてくれてうれしい。 –

関連する問題