0

我正在更新这个,因为虽然问题得到了回答,但与标题无关的是:) 我怎样才能最好地管理 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
4

2 回答 2

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 = fsUtils这相当于Utils.fs = fs;用 JavaScript 编写。然后你尝试fs在你的MyClass类中使用它来访问它,这是没有意义的,因为 fs 不在范围内,因为它附加到 Utils。

Utils.fs.readFile 'any_old_file', (error, fd) =>如果您想访问fs之前保存的参考,您必须这样做。

于 2012-08-14T04:45:19.663 回答
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
于 2012-08-15T13:01:08.317 回答