coffeescript中的命名空间
namespaces in coffeescript
我想像在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的上下文对象)一起使用时忽略它的有用性。
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中似乎不鼓励使用这种技术,也不支持使用这种技术。
- 在javascript中使用命名空间
- 为什么不推荐使用“with”?是否有更好或其他方法可以“下降”到对象的命名空间
- javascript中的命名空间,IDE中支持代码完成/内容辅助's
- 如何使用javascript命名空间
- js命名空间和变量范围
- html,js-如何限制元素"范围“-命名空间
- 转换自的JavaScript命名空间
- 命名空间与自调用函数
- 什么's当前命名空间/类中JavaScript子命名空间/类的语法
- 无法加载Ace.js编辑器模式和主题(命名空间项目&AMD require.js&grunt
- jQuery命名空间和使用“;这个“;
- 在Firebug控制台中监视javascript命名空间变量
- jQuery事件命名空间是否可以包含破折号
- 用自定义javascript全局命名空间替换窗口
- 如何在Typescript中导出具有其他名称的命名空间
- 从html文件中的脚本标记调用非全局命名空间函数
- 正在测量全局命名空间的污染
- 谷歌闭包命名空间冲突
- socket.io:断开连接事件 - “传输关闭”、“客户端命名空间断开连接”、“传输错误”和“强制关闭”
- 怎么了?通过字符串定义 JavaScript 命名空间