JavaScript:如何创建一个具有字符串名称的对象

JavaScript: How to create an object having its string name

本文关键字:对象 字符串 一个 何创建 JavaScript 创建      更新时间:2023-09-26

我在客户端中声明了一个命名空间和类。事实上,我在几个名称空间中声明了一大堆类。当我在页面加载时从服务器上获得一个包含"点"namespace.class名称的字符串时,我只需要获得其中一个的实例。

目前我使用eval来实现这一点,但这会导致内存泄漏,因此我正试图找到一种替代方法,通过只知道声明对象的名称来实例化它。像var obj = "myNamespace.myObjectName"();这样的东西显然是行不通的。

如果我有一个对象名称作为字符串变量,我可以使用eval()函数来创建该对象的实例:

window["myNamespace"] = {};
myNamespace.myObjectName = function() { /* blah */ };
var name = "myNamespace.myObjectName";
var obj = eval("new "  + name + "()");

但由于几个原因,我不想/不能使用eval。如何在不使用eval的情况下按名称创建对象?

听起来您无法控制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,就可以轻松地获取任何值。