javascript - 在 JavaScript 对象方法中从变量创建新对象

标签 javascript object

我正在尝试通过对象方法内部的变量创建对象。像这样的事情:

    ObjectFactory = function(){

    }
    ObjectFactory.prototype.createObject = function(objectName){
        return new objectName;
    }

    var of = new ObjectFactory();
    var MyObject = of.createObject('MyObjectClassName');

知道如何做吗?

最佳答案

只需删除引号(并在var后添加一个空格):

var MyObject = of.createObject(MyObjectClassName);

(如果您确实想要使用字符串,请参见下文。)

完整示例:Live Copy

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Example</title>
    <style>
      body {
        font-family: sans-serif;
      }
    </style>
  </head>
  <body>
    <script>
      (function() {
        "use strict";

        var ObjectFactory = function(){

        };

        ObjectFactory.prototype.createObject = function(ctor){
          return new ctor;
        };

        function Foo() {

        }

        var of = new ObjectFactory();
        var f = of.createObject(Foo);
        display("<code>f instanceof Foo</code>? " + (f instanceof Foo));

        function display(msg) {
          var p = document.createElement('p');
          p.innerHTML = String(msg);
          document.body.appendChild(p);
        }
      })();
    </script>
  </body>
</html>
<小时/>

如果您确实需要在那里使用字符串而不是函数引用,那么除非您想使用 eval(通常最好避免),否则您需要一个对象来查找构造函数函数(例如,从字符串名称获取构造函数)。

如果构造函数是全局,您可以在全局对象上查找它们,但全局是一个坏主意。相反,给自己一个 map 对象并将构造函数设置为 map 的属性:

var constructorMap = {
    MyObjectClassName: MyObjectClassName
};

您甚至可以将其放在“ObjectFactory”上:

ObjectFactory.constructorMap = {
    MyObjectClassName: MyObjectClassName
};

然后

ObjectFactory.prototype.createObject = function(objectName){
    return new ObjectFactory.constructorMap[objectName];
};

完整示例:Live Copy

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Example</title>
    <style>
      body {
        font-family: sans-serif;
      }
    </style>
  </head>
  <body>
    <script>
      (function() {
        "use strict";

        function Foo() {

        }

        var ObjectFactory = function(){

        };

        ObjectFactory.constructorMap = {
          Foo: Foo
        };

        ObjectFactory.prototype.createObject = function(objectName){
          return new ObjectFactory.constructorMap[objectName];
        };

        var of = new ObjectFactory();
        var f = of.createObject("Foo");
        display("<code>f instanceof Foo</code>? " + (f instanceof Foo));

        function display(msg) {
          var p = document.createElement('p');
          p.innerHTML = String(msg);
          document.body.appendChild(p);
        }
      })();
    </script>
  </body>
</html>

关于javascript - 在 JavaScript 对象方法中从变量创建新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25471520/

相关文章:

c# - 在 C# 中,当括号表示法不起作用时如何访问对象的对象?

javascript - jQuery:slideDown 无法正常工作

javascript - dataLayer.push() 在 anchor 上触发时肯定会向谷歌发送数据吗?

java - 使用synchronized(obj) 和声明锁之间的区别

c++公共(public)对象更改应该调用函数

c++ - 对对象 vector 进行排序

javascript - 通过ajax将数组发送到php。

javascript - 在 KENDO UI Multiselect 中选择默认值

javascript - 转储 JQuery 对象

PHP - 基于 Off Factor 对数组进行排序::usort?