coffeescript中的单身人士课程

sui*_*ish 6 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"
Run Code Online (Sandbox Code Playgroud)

以下代码是由上面的代码生成的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);
Run Code Online (Sandbox Code Playgroud)

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

Leo*_*tny 9

首先,在CoffeeScript Cookbook中有一个很好的Singleton Pattern实现示例:

class Singleton
  instance = null

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

  @get: (message) ->
    instance ?= new PrivateClass(message)
Run Code Online (Sandbox Code Playgroud)

你试图做类似的事情,但稍微混淆了CoffeeScript语法.以下是它的外观:

class BaseClass
  class Singleton

  singleton = new Singleton()

  constructor: ->
    return singleton
Run Code Online (Sandbox Code Playgroud)

请注意,我在return这里使用了一个显式.我这样做是因为CoffeeScript隐式返回不适用于类构造函数.

我还建议你看一下在JavaScrip问题中实现singleton的最简单/最简洁的方法.

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

class BaseClass
  instance = null

  constructor: ->
    if instance
      return instance
    else
      instance = this
    # contructor code
Run Code Online (Sandbox Code Playgroud)

除了两件事之外,它的工作方式与您的相似:

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