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

时间:2010-02-12 04:09:46

标签: javascript

在javascript中,有什么区别:

var singleton = function(){ ... }

var singleton = new function(){ ... }

按照crockford(http://www.crockford.com/javascript/private.html)的描述声明特权函数只能使用后者。

2 个答案:

答案 0 :(得分:5)

区别主要在于您的第二个示例中,您将函数表达式用作Constructornew运算符将导致函数自动执行,this该函数内的值将引用新创建的对象。

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

特权方法也可用于您的第二个示例,常见模式使用immediately invoked function expression,创建closure,其中私有成员可访问,然后您可以返回包含公共API 的对象,例如:

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

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

  return { // public API
    publicMethod: function () {
      // private members are available here
    }
  };
})();

答案 1 :(得分:0)

我认为crockford描述的特权函数看起来像这样:

function Test() {
     this.privileged = function() {
          alert('apple');
     }
     function anonymous() {
         alert('hello');
     }
     anonymous();
}

t = new Test; // hello
t.privileged(); // apple

// unlike the anonymous function, the privileged function can be accessed and
// modified after its declaration

t.privileged = function() {
     alert('orange');
}

t.privileged(); // orange