Coffeescript:从同一个对象

时间:2016-12-24 18:55:08

标签: javascript arrays function object coffeescript

我正在尝试为Atom文本编辑器编写一个包,在我的主类(init.coffee)中,我的module.exports中有一个数组:

servers: []

我想从module.exports的另一部分中的函数访问这个数组,但是我遇到了麻烦。

功能:

stas: () ->
    dir = getFilePath()
    d = fs.statSync dir
    if !d.isDirectory()
        dirError dir
    else
        s = new Server dir
        s.init()
        @servers.push s
    return

我一直收到这个错误:

Uncaught TypeError: this.servers.push is not a function

我这样称呼函数:

@events.add atom.commands.add ".tree-view", {
  'atom-together:startServer': @stas
  'atom-together:startClient': @stac
  'atom-together:stopServer': @stos
  'atom-together:stopClient': @stoc
}

在coffeescript中调用此数组的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

JavaScript / CoffeeScript函数中this(AKA @)的值通常取决于它的调用方式,而不是它的定义位置。此外,@stas只是对stas函数的引用,而this将是调用者在调用该函数时所希望的内容。

如果您在回调函数中需要特定的@(AKA this),请将其定义为bound function

stas: () => # Note the => instead of ->
  #...

或在将其传递给事件系统时使用Function.prototype.bind绑定它:

@events.add atom.commands.add ".tree-view", {
  'atom-together:startServer': @stas.bind(@)
  #...
}

另外,如果您在课程级别定义servers: [],请执行以下操作:

class C
  servers: []

然后你在所有类的实例中共享那个servers数组,这可能不是你想要的。在类级别定义的内容通过所有实例中的原型共享。例如:

class C
  a: [ ]

c1 = new C
c2 = new C
c1.a.push 11
console.log c1.a, c2.a

会在控制台中放置两个[11],因为c1.ac2.a是相同的数组。您通常最好在constructor中定义可变值以避免此共享(除非您特别希望它发生);这个版本:

class C
  constructor: (@a = [ ]) ->

c1 = new C
c2 = new C
c1.a.push 11
console.log c1.a, c2.a

会在控制台中为您提供[11][],而这通常是您正在寻找的行为。