Coffeescript 类构造新实例的方法

Coffeescript 类构造新实例的方法,coffeescript,Coffeescript,我想在CoffeeScript课程上模仿 让我感到困惑的是定义@scope函数时的上下文。@scope函数本身应该在底层类的上下文中执行,但它传递的函数应该在该实例的上下文中运行 这里是我所拥有的,但是弹出的函数最终在窗口的上下文中运行,而不是在调用它的实例中运行 class Collection models: [] @scope: (name, funct) -> @.prototype[name] = -> new @constructor(fun

我想在CoffeeScript课程上模仿

让我感到困惑的是定义
@scope
函数时的上下文。
@scope
函数本身应该在底层类的上下文中执行,但它传递的函数应该在该实例的上下文中运行

这里是我所拥有的,但是弹出的
函数最终在窗口的上下文中运行,而不是在调用它的实例中运行

class Collection
  models: []

  @scope: (name, funct) ->
    @.prototype[name] = ->
      new @constructor(funct())

  constructor: (models) ->
    @models = models

class Bubbles extends Collection
  @scope 'popped', ->
    @models.slice(1, @models.length)

  first: ->
    @models[0]


console.log(new Bubbles([1,2,3,4]).popped()) # should return an instance of Bubbles with models == [2,3,4]

问题是您正在以简单函数的形式调用
funct

new @constructor(funct())
因此,
@
内的
函数
将成为
窗口
。您可以使用或指定
@
应该是什么(即作为方法调用函数):

请注意,我还切换到了
,因为这是比
prototype
更地道的咖啡脚本

演示:

@scope: (name, funct) ->
  @::[name] = ->
    new @constructor(funct.apply(@))