javascript - coffeescript 中的单例类

标签 javascript coffeescript

我最近在如下所示的 coffeescript 中使用单例模式类。 它工作得很好,但我不知道为什么这可能是单例模式。 这可能是一个愚蠢的问题,但感谢您的回答。

#coffeescript
class BaseClass
  class Singleton

  singleton = new Singleton()
  BaseClass = -> singleton

a = new BaseClass()
a.name = "John"
console.log a.name # "John"
b = new BaseClass()
b.name = "Lisa"
console.log b.name # "Lisa"
console.log a.name # "Lisa"

下面的代码是由上面的代码生成的javascript

var BaseClass, a, b;

BaseClass = (function() {
  var Singleton, singleton;

  function BaseClass() {}

  Singleton = (function() {
    function Singleton() {}

    return Singleton;

  })();

  singleton = new Singleton();

  BaseClass = function() {
    return singleton;
  };

  return BaseClass;

})();

a = new BaseClass();

a.name = "John";

console.log(a.name);

b = new BaseClass();

b.name = "Lisa";

console.log(b.name);

console.log(a.name);

已编辑: 我不是在问“单例模式”的定义,也不是在问它们通常是如何创建的,而是上面的代码总是返回相同实例而不是创建新实例的原因。

最佳答案

首先,有一个good example of Singleton Pattern implementation in CoffeeScript Cookbook :

class Singleton
  instance = null

  class PrivateClass
    constructor: (@message) ->
    echo: -> @message

  @get: (message) ->
    instance ?= new PrivateClass(message)

您尝试做类似的事情,但稍微弄乱了 CoffeeScript 语法。它应该是这样的:

class BaseClass
  class Singleton

  singleton = new Singleton()

  constructor: ->
    return singleton

请注意,我在这里使用了明确的return。我这样做是因为 CoffeeScript 隐式返回不适用于类构造函数。

我还建议您看一下 Simplest/Cleanest way to implement singleton in JavaScrip问题。

我最喜欢的单例实现如下:

class BaseClass
  instance = null

  constructor: ->
    if instance
      return instance
    else
      instance = this
    # contructor code

除了两点,它和你的一样工作:

  • 它不需要额外的类定义;
  • 它仅在需要时创建第一个单例实例。

关于javascript - coffeescript 中的单例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25828901/

相关文章:

javascript - 向内三 Angular 形添加边框

javascript - 日期选择器(忽略无效日期)

javascript - 在 Javascript 中传递 DOM 对象时未定义

javascript - rails : redirect_to:back not redirecting in spite of showing correct logs

javascript - JQuery $.extend 可以与索引一起使用吗?

javascript - PHP 比较两个日期

javascript - 如何添加右键单击我的 Firefox 扩展图标的功能?

javascript - 如何将变量从 javascript (coffeescript) 传递到 Rails Controller ?

javascript - 使用分页主干集契约(Contract)时获取

javascript - 将 jQuery 自动完成数据附加到 textarea 内容而不是覆盖它