从javascript对象方法中的变量创建新对象

create new object from variable in javascript object method

本文关键字:对象 新对象 创建 javascript 方法 变量      更新时间:2023-09-26

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

<>之前ObjectFactory = function(){}ObjectFactory.prototype.createObject = function(objectName){返回新的objectName;}var = 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(通常最好避免使用),否则你需要一个对象来查找构造函数(例如,从字符串名称中获取构造函数)。

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

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>

传递给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);