【问题标题】:create new object from variable in javascript object method从 javascript 对象方法中的变量创建新对象
【发布时间】:2014-08-24 12:06:34
【问题描述】:

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

对象工厂 = 函数(){ } ObjectFactory.prototype.createObject = function(objectName){ 返回新的对象名; } var of = new ObjectFactory(); var MyObject = of.createObject('MyObjectClassName');

知道怎么做吗?

【问题讨论】:

    标签: javascript object


    【解决方案1】:

    只需删除引号(并在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(通常最好避免),否则你需要一个对象来查找构造函数(例如,从字符串名称中获取构造函数)。

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

    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>
    

    【讨论】:

      【解决方案2】:

      作为参数传递给ObjectFactory.prototype.createObject 的内容必须具有function 类型,不能将字符串或其他类型传递给此函数。因为在该函数中,您已将输入参数作为构造函数调用。以下代码可能没问题:

      ObjectFactory.prototype.createObject = function(objectName){
          return new objectName;
      }
      
      /* This function is going to be a constructor function */
      function MyObjectClassName {
          this.properties = /* some value */;
          this.methods = /* some functions */
      }
      
      var of = new ObjectFactory();
      var MyObject = of.createObject(MyObjectClassName);
      

      使用示例:

      var array = of.createObject(Array);
      array.push(1);
      

      【讨论】:

        猜你喜欢
        • 2011-08-15
        • 2011-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多