我最近在如下所示的 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/