与超类的依赖关系

时间:2012-08-14 04:27:32

标签: javascript node.js coffeescript

我正在更新这个,因为问题得到解答后,与标题无关的是:)我怎样才能最好地管理CoffeeScript类的依赖项?

假设我有一个超级班,'utils.coffee':

fs = require 'fs'
# another bazillion libs

class Utils

  doThis: () ->
    console.log 'done!'

exports.Utils = Utils

在我的子课程中,我可以轻松拨打doThis。但是,如果没有收到错误,我就无法引用fsReferenceError: fs is not definedmyclass.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

2 个答案:

答案 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