我在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);
已编辑: 我不是要问单身模式的定义'它们通常是如何创建的,但上面的代码总是返回相同的实例而不是创建新实例的原因。
答案 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()