javascript单例问题

Sha*_*awn 19 javascript singleton

我刚刚在javascript中讨论了单例设计的几个主题.我是100%新设计模式的东西,但正如我所看到的,因为根据定义,Singleton不需要实例化,概念上如果它不被实例化,在我看来它不必被视为从蓝图(类)创建的常规对象.所以我的奇怪是为什么不仅仅考虑一个单独的东西,就像静态可用的东西,包含在某种范围内,应该是全部.

从我看到的主题,他们中的大多数通过传统的javascript制作单身

new function(){} 
Run Code Online (Sandbox Code Playgroud)

然后创建一个伪构造函数.

我只是觉得一个对象字面就足够了:

var singleton = {
   dothis: function(){},
   dothat: function(){}
}
Run Code Online (Sandbox Code Playgroud)

对?或者任何人都有更好的见解?

[更新]:我的观点再次表明,为什么人们只是使用更简单的方法在javascript中制作单身,就像我在第二个片段中所示,如果有绝对的原因请告诉我.我经常害怕这种情况,我简化了很多事情:D

CMS*_*CMS 31

我同意你的观点,最简单的方法是使用对象文字,但如果你想要私有成员,你可以实现利用闭包:

var myInstance = (function() {
  var privateVar;

  function privateMethod () {
    // ...
  }

  return { // public interface
    publicMethod1: function () {
      // private members can be accessed here
    },
    publicMethod2: function () {
      // ...
    }
  };
})();
Run Code Online (Sandbox Code Playgroud)

关于new function(){}构造,它将简单地使用匿名函数作为a constructor function,该函数内的上下文将是将返回的新对象.

编辑:为了回应@ J5的评论,这很简单,实际上我认为这可以成为使用延迟函数定义模式的一个很好的例子:

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

    function privateMethod () {
      // ...
    }

    return { // public interface
      publicMethod1: function () {
          // private members can be accessed here
       },
      publicMethod2: function () {
        // ...
      }
    };
  })();

  singleton = function () { // re-define the function for subsequent calls
    return instance;
  };

  return singleton(); // call the new function
}
Run Code Online (Sandbox Code Playgroud)

当第一次调用该函数时,我创建了对象实例,并重新分配singleton给一个新函数,该函数在其闭包中具有该对象实例.

在第一次调用结束之前,我执行singleton将返回创建的实例的重新定义的函数.

singleton函数的调用将简单地返回instance存储在其闭包中的函数,因为新函数是将要执行的函数.

您可以通过比较返回的对象来证明:

singleton() == singleton(); // true
Run Code Online (Sandbox Code Playgroud)

仅当两个操作数的对象引用相同时==,对象的运算符才会返回,即使对象相同但它们是两个不同的实例,它也将返回false:true

({}) == ({}); // false
new Object() == new Object(); // false
Run Code Online (Sandbox Code Playgroud)