在javascript中动态创建类

时间:2012-08-29 15:40:22

标签: javascript google-chrome

如果我动态定义和创建类的实例,如下所示:

var type = 'Animal';
window[type] = function() {};
var animal1 = new window[type]();
var animal2 = new Animal();

然后animal1将在Chrome调试器中显示为Object的实例(但具有正确的属性),而animal2的类型为window.Animal

静态定义Animal时:

function Animal() {}

这两个对象都被视为Animal的实例。

如何在动态定义函数时(不使用eval)实现此目的?

1 个答案:

答案 0 :(得分:1)

Chrome控制台显示的化妆品似乎取决于:

  1. 构造函数的name属性,或
  2. 构造函数最初分配的变量名称(如果未设置name)。
  3. 案例#1:

    var ClassA = function ClassB() {};
    new ClassA();
    // reports a `ClassB` object
    

    构造函数的name属性设置为ClassB,这就是Chrome报告的内容。函数name只能在定义时设置,因此function funcName(){}设置name,而func=function(){}; f.name='funcName';不设置。{/ p>

    案例2:

    var ClassA = function() {};
    ClassB = ClassA;
    new ClassB();
    // reports a `ClassA` object
    

    构造函数最初被分配给ClassA,因此该名称似乎被烧入构造函数中,即使它在另一个变量别名下使用。实际上,执行delete window.ClassA并不会阻止新构造的对象将自己报告为ClassA对象:

    var ClassA = function() {};
    ClassB = ClassA;
    delete window.ClassA;
    new ClassB();
    // still reports a `ClassA` object
    // even though `ClassA` is no longer a defined variable name
    

    这是“动态定义”案例中发生的事情。最初的window[type] = function() {};行永久地标记构造函数的结果对象,以标识为“anonymous function that's a property of window”类型。

    请注意,这些控制台化妆品不会影响程序的功能,因为所有对象/原型功能仍然按预期工作。