使用new运算符初始化单例javascript对象?

jd.*_*jd. 1 javascript

在javascript中,有什么区别:

var singleton = function(){ ... }
Run Code Online (Sandbox Code Playgroud)

var singleton = new function(){ ... }
Run Code Online (Sandbox Code Playgroud)

声明crockford(http://www.crockford.com/javascript/private.html)所描述的特权功能仅适用于后者.

CMS*_*CMS 5

不同之处主要在于您的第二个示例中,您使用函数表达式作为构造函数,new运算符将使函数自动执行,并且该this函数内的值将引用新创建的对象.

如果您没有从该函数返回任何内容(或者您没有返回非原始值),则this返回该值并将其分配给您的singleton变量.

特权方法也可以在你的第二个例子中,一个常见的模式是使用一个立即调用的函数表达式,建立一个封闭,其中私有成员都可以访问,那么你就可以返回包含你的对象的公共API,例如:

var singleton = (function () {
  var privateVar = 1;

  function privateMethod () {/*...*/}

  return { // public API
    publicMethod: function () {
      // private members are available here
    }
  };
})();
Run Code Online (Sandbox Code Playgroud)