Javascript coffeescript中的Singleton类
我最近在coffeescript中使用了singleton模式类,如下所示。 它工作得很好,但我不知道为什么这可能是一个单例模式。 这可能是个愚蠢的问题,但谢谢你的回答Javascript coffeescript中的Singleton类,javascript,coffeescript,Javascript,Coffeescript,我最近在coffeescript中使用了singleton模式类,如下所示。 它工作得很好,但我不知道为什么这可能是一个单例模式。 这可能是个愚蠢的问题,但谢谢你的回答 #coffeescript class BaseClass class Singleton singleton = new Singleton() BaseClass = -> singleton a = new BaseClass() a.name = "John" console.log a.name
#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);
编辑:
我不是问“单例模式”的定义,也不是问它们通常是如何创建的,而是问为什么上面的代码总是返回相同的实例,而不是创建新的实例。因为
new BaseClass()
与BaseClass()
返回对象时的BaseClass()
相同。在这种情况下,
BaseClass()
返回对象singleton
,因此newbaseclass()
也返回singleton
来自 singleton模式是一种设计模式,它将类的实例化限制为一个对象 因为在您的示例中,
a
中的更改反映在b
中,这表明它们是同一个对象,因此这是单例模式
如果页面上只应该有某个对象的单个实例,例如AJAX控件,则可以使用此选项。在JavaScript中,您不能阻止有人使用“new”调用您的函数,如
var b=new BaseClass()
,但您可以确保使用此模式只返回一个实例 只需声明一个仅用于包含实例的实例
变量
Singleton = ->
self = this
self.foo = ->
# stuff here
self
module.exports = @instance ?= new Singleton()
首先,有一个:
类单例
实例=null
类私有类
构造函数:(@message)->
回声:->@信息
@获取:(消息)->
实例?=新PrivateClass(消息)
您尝试过做类似的事情,但有点弄乱了CoffeeScript语法。下面是它的外观:
类基类
单件阶级
singleton=新的singleton()
构造函数:->
返回单身
注意,我在这里使用了显式的返回。我这样做是因为CoffeeScript隐式返回对类构造函数不起作用
我还建议你们看看这个问题
我最喜欢的单例实现如下:
类基类
实例=null
构造函数:->
例如
返回实例
其他的
实例=此
#构造码
除了两件事外,它的工作原理与您的类似:
- 它不需要额外的类定义李>
- 它只在需要时创建第一个单例实例
我不是问“singleton模式”的定义,而是问问题中的代码为什么可以是singleton。我解释了什么是singleton,为什么您的代码是singleton,为什么您可以选择singleton。如果您想了解更多信息,可能您的问题需要反映您的需要。您可以在调试器中运行此代码,查看此代码的“为什么”或“如何”功能。完美!!这正是我想知道的。谢谢。