我正在更新这个,因为问题得到解答后,与标题无关的是:)我怎样才能最好地管理CoffeeScript类的依赖项?
假设我有一个超级班,'utils.coffee':
fs = require 'fs'
# another bazillion libs
class Utils
doThis: () ->
console.log 'done!'
exports.Utils = Utils
在我的子课程中,我可以轻松拨打doThis
。但是,如果没有收到错误,我就无法引用fs
:ReferenceError: fs is not defined
。 myclass.coffee
:
{Utils} = require './utils.coffee'
class MyClass extends Utils
doThat: () ->
fs.readFile 'any_old_file', (error, fd) =>
buffer = fd.toString()
# do stuff
exports.MyClass = MyClass
比我们运行它:
{MyClass} = require('./myclass.coffee')
myclass = new MyClass()
myclass.doThis() # Cool!
myclass.doThat() # Not good
答案 0 :(得分:0)
您不应将@
放在trace
方法之前。这使得它成为类级函数而不是实例级,以及该类中的所有其他方法。
trace: (className, method) ->
我还建议您将require调用移到顶级作用域,因为每次实例化对象时都没有理由调用require。
而不是:
@restler = require('restler')
@_ = require('underscore')
把它放在最上面:
restler = require 'restler'
_ = require 'underscore'
更好的Coffeescript方法:
Utils = require('./utils.coffee').Utils
就是这样:
{Utils} = require './utils.coffee'
而不是:
(if (results and results.length > 1) then results[1] else '')
这样做:
if results?.length > 1 then results[1] else ''
我想这也是:
@buildKey: (args)
应该是一个splat,可以像这样重写:
buildKey: (args...)
@debug(@getName(), 'buildKey', "arg: #{arg}") for arg in args
return args.join ':'
我建议您熟悉CoffeeScript范围规则,因为这似乎是您大多数问题的根源。
您的@fs = fs
课程中有Utils
。这相当于在JavaScript中编写Utils.fs = fs;
。然后尝试使用fs
类中的MyClass
来访问它,这没有任何意义,因为fs不在范围内,因为它附加到Utils。
如果您想访问之前保存的Utils.fs.readFile 'any_old_file', (error, fd) =>
引用,则必须执行fs
。
答案 1 :(得分:0)
仅在fs
文件中引用utils.coffee
,但在Utils
之外,不允许我从其他文件访问它。我必须像这样设置它:
fs = require 'fs'
# another bazillion libs
class Utils
@fs = fs
doThis: () ->
console.log 'done!'
exports.Utils = Utils
然后,我只是像以下一样访问它:
{Utils} = require './utils.coffee'
class MyClass extends Utils
doThat: () ->
Utils.fs.readFile 'any_old_file', (error, fd) =>
buffer = fd.toString()
# do stuff
exports.MyClass = MyClass