Javascript 带有隐藏变量的Coffeescript中的模块模式
深入研究Coffeescript,我正在尝试将我的Javascript文件移植到Coffeescript 关于这一点,我有一个问题与Doulgas Crockford的模块模式有关(闭包绑定以保持变量“私有”) 因此,我的问题是:以下JS的aquivalent咖啡脚本是什么样子的:Javascript 带有隐藏变量的Coffeescript中的模块模式,javascript,module,design-patterns,coffeescript,Javascript,Module,Design Patterns,Coffeescript,深入研究Coffeescript,我正在尝试将我的Javascript文件移植到Coffeescript 关于这一点,我有一个问题与Doulgas Crockford的模块模式有关(闭包绑定以保持变量“私有”) 因此,我的问题是:以下JS的aquivalent咖啡脚本是什么样子的: var test = function () { var hidden = 'open'; return { open: hidden }; }(); 在Coffeescript中是否有与此模式不同/更好的方法?C
var test = function () { var hidden = 'open'; return { open: hidden }; }();
在Coffeescript中是否有与此模式不同/更好的方法?Coffeescript(或者更确切地说,coffee
脚本)会自动将代码包装到匿名函数中,除非您告诉它不要这样做
如果需要从匿名闭包中发布对象,可以显式地将它们分配给根对象;请参见下划线.coffee的开头,以了解一些提示
我认为最好的方法是借助
do
关键字(主要用于捕获循环中的值,请参见我的):
这可编译为
var test;
test = (function() {
var hidden;
hidden = 'open';
return {
open: hidden
};
})();
与您的代码相同,但格式不同。(CoffeeScript编译器会自动将所有
var
声明放在其作用域的顶部,这样就可以通过查看JavaScript输出轻松确定变量的作用域。)我在CoffeeScript wiki中添加了一个关于如何处理名称空间的部分。(我认为)它相当优雅
Coffeescript没有比将所有源代码文件封装在匿名函数中更高的本机模块系统。然而,通过一些简单的技巧,您可以拥有Ruby羡慕的模块。
我定义我的模块如下
@module "foo", ->
@module "bar", ->
class @Amazing
toString: "ain't it"
模块助手的实现是
window.module = (name, fn)->
if not @[name]?
this[name] = {}
if not @[name].module?
@[name].module = window.module
fn.apply(this[name], [])
如果愿意,可以将其放入另一个源文件中。然后,您可以通过命名空间模块访问类
x = new foo.bar.Amazing
对于您的具体问题,我认为下面的茉莉花规格使用我的
模块系统
@module "test", ->
hidden = 10
@open = hidden
describe "test", ->
it "has no hidden", ->
expect(test.hidden?).toEqual false
it "has open", ->
expect(test.open?).toEqual true
如果您可以在单个类中编写模块,那么使用
-b
选项编译coffeescript将自然创建您正在寻找的模块模式
这:
汇编如下:
var检验;
test=(函数(){
隐藏var;
隐藏='打开';
test.prototype.open=隐藏;
回归试验;
})();
这与您所寻找的非常接近。“它的存在主要是为了捕获循环中的值”<不同意。
do
的这种特殊行为可以说是最不一致/最令人困惑的特征之一。马特尔,你能解释一下吗?do关键字在我看来像是捕获了本地范围内的值。@matyr当你最初提出它时,它不是do
的预期目的,但它确实是Jeremy(不情愿地)将它添加到CoffeeScript中的原因。看见它也是在中出现的唯一上下文。do
。如我在中所述,该功能破坏了一致性(为什么do(I)->
和do f=(I)->
的行为会有所不同?)。事实上,文件记录较少只是另一个缺陷(毕竟这是圣诞节最后一刻的变化)。为什么他们真的要这么做呢。我在今天早些时候的[#960](github.com/jashkenas/coffee script/issues/960)上注意到了这一点。我当然希望Jeremy会选择修复这些不一致的地方,而不是放弃这个功能。
@module "test", ->
hidden = 10
@open = hidden
describe "test", ->
it "has no hidden", ->
expect(test.hidden?).toEqual false
it "has open", ->
expect(test.open?).toEqual true
class test
hidden = 'open'
open: hidden