coffeescript中的命名空间

namespaces in coffeescript

本文关键字:命名空间 coffeescript      更新时间:2023-09-26

我想像在javascript中那样使用名称空间,使用关键字"with",但CoffeeScript报告这是一个保留关键字,并拒绝编译。有什么方法可以在cs中使用名称空间吗?

特别是,我希望动态地包含CoffeeScript文件(可信源),就像为数据库模式加载模型一样,但我希望包含的脚本能够访问本地命名空间。


编辑:

以下是我想做的。我正在建立一个web框架,将目录树映射到基于express和mongoose的应用程序。例如,有一个子目录"models",其中包含一个文件"user.coffee",其内部代码如下:

name:
    type: String
    unique: on
profiles: [ Profile ]

其中Profile是位于名为model的本地对象中的类。当加载用户模型时,我希望它访问本地模型存储中的模型类。

我目前的工作是将model.Profile写入文件"user.coffee"中。希望它能清楚我的意思。


第二次编辑

以下是我在不使用with:的情况下如何做到的

user.coffee

name:
    type: String
    unique: on
profiles: [ @profile ]

profile.coffee

content: String

以下是它的动态加载方式:

for fm in fs.readdirSync "#{base}/models"
    m = path.basename fm, '.coffee'
    schema[m] = (()->
        new Schema coffee.eval (
            fs.readFileSync "#{base}/models/#{fm}", 'utf8'
        ), bare: on
    ).call model
    mongoose.model m, schema[m]
    model[m] = mongoose.model m

对我来说似乎是一个不错的解决方案。

把别人的意见强加给你?现在是黑客时间™!

o =
  a: 1
  b: 2
  c: 3
`with(o) {//`
  alert a
`}`

"编译"为:

var o;
o = {
  a: 1,
  b: 2,
  c: 3
};
with(o) {//;
alert(a);
};

遗憾的是,这是道格·克罗克福德的观点被视为福音的另一个领域。with Statement Considered Hazardous基于属性写入的模糊性而拒绝它,但在与只读上下文对象(如定义类似DSL的API的上下文对象)一起使用时忽略它的有用性。

CoffeeScript的Coco fork支持with语法;看见https://github.com/satyr/coco/wiki/additions.然而,该语法只是将this的值设置为块中的目标对象,而不是编译为有问题且不推荐使用的with关键字。

假设您想在CoffeeScript中模仿Coco的with语法。你可以这样做:

withObj = (obj, func) -> func.call obj

然后你可以写

withObj = (obj, func) -> func.call obj
withObj annoyingly.lengthy.obj.reference, ->
  @foo = 'bar'
  @bar = 'baz'

当然,在这种简单的情况下,最好使用像jQuery或Underscore的extend:这样的实用函数

_.extend annoyingly.lengthy.obj.reference, foo: 'bar', bar: 'baz'

否。但是,可以使用析构函数赋值来实现类似的效果。

{foo, bar, baz} = require 'toocoollib'
foo 'whoa!'

您还应该注意,with关键字已被弃用,并且在ES5严格模式中是一个语法错误。主流JS黑客一致认为with是个坏主意。

如果你发布了一个你想做什么的例子,我可以给出一个更具体的答案。

刚刚在CoffeeScript常见问题页面上发现了关于"变量导入"的内容:

https://github.com/jashkenas/coffee-script/wiki/FAQ

CoffeeScript中似乎不鼓励使用这种技术,也不支持使用这种技术。