coffeescript中的单身人士课程

时间:2014-09-14 00:07:11

标签: 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);

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

4 个答案:

答案 0 :(得分:9)

首先,有一个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
除了两件事之外,它的工作方式与你的一样:

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

答案 1 :(得分:0)

来自Wikipedia

  

单例模式是一种设计模式,它将类的实例化限制为一个对象

由于在您的示例中,a中的更改反映在b中,它表明它们是同一个对象,因此这是Singleton模式。

如果页面上只有一个单独的实例,例如AJAX控件,则可以使用它。在JavaScript中,您无法阻止某人使用“new”调用您的函数,如var b = new BaseClass()中所示,但您可以确保使用此模式仅返回单个实例。

答案 2 :(得分:-1)

new BaseClass()返回对象时,BaseClass()BaseClass()相同 在这种情况下,BaseClass()会返回对象singleton,因此new BaseClass()也会返回singleton
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new

答案 3 :(得分:-1)

您只需声明一个instance变量,该变量仅用于包含您的实例。

  Singleton = ->
    self           = this

    self.foo = ->
      # stuff here

    self

  module.exports = @instance ?= new Singleton()