使用Javascript中的闭包在对象上调用new

时间:2014-11-03 02:50:05

标签: javascript closures new-operator

当在使用闭包的对象上调用new时,根据我的理解,闭包是在实例化时设置的,其中私有变量将是'类的静态属性。

例如:

var testClass=(function(){
  var self={...properties...};
  return function(){
    return {
        someFunc: (function(){
          var self={...other properties...}
          return {
            self: self
          };
        }())
    };
  };
}());

var newObject=new testClass();

因此,如果我需要将someFunc实例存储为testClass的属性,我可以使用上面的语法吗? Will' var self'在someFunc中,每次创建一个新的testClass实例时都会被实例化,或者闭包是一次性交易,其中所有实例都是instanceA.someFunc.self == instanceB.someFunc.self如果instanceA = new testClass();和instanceB = new testClass();

希望这是有道理的。我还没有测试过它

1 个答案:

答案 0 :(得分:1)

此代码甚至无法正常工作。这是将要发生的事情:

外部IIFE将在代码初始化时运行。这将建立:

var self = {...};

一次变量testClass将包含你的内部对象。

然后,你会做:

var newObject=new testClass();

并得到一个错误,因为testClass是一个对象,而不是构造函数。此jsFiddle中的确切错误为:Uncaught TypeError: object is not a function


编辑:现在您已经更改了代码。

最外面的var self= {...}只会在外部IIFE运行时实例化一次。这对testClass()的所有实例都很常见。这是因为外部IIFE只运行一次,并且在其中创建的变量成为闭包的一部分,内部函数的所有实例(它成为您的实际构造函数)然后共享。

每次调用self时,内部someFunc()obj.someFunc()中的内容)将单独创建,在someFunc()内,本地声明的内容将覆盖更高级{ {1}}您将无法访问self中的更高级别。

我通常认为在较高级别父作用域中已定义的本地作用域中使用相同的变量名称是一种不好的做法,因为它没有为您提供有用的功能,只是对于什么是完全混淆或欺骗的机会。真的在继续。选择一个唯一的名称。