构造新实例的类方法

时间:2013-11-22 01:06:22

标签: coffeescript

我想在CoffeeScript类上模仿ActiveRecord scopes

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

这就是我所拥有的,但popped函数最终在Window的上下文中运行,而不是在调用它的实例中运行。

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]

1 个答案:

答案 0 :(得分:2)

问题是你将funct称为一个简单的函数:

new @constructor(funct())

因此@内的funct将为window。您可以使用applycall来指定@应该是什么(即将该函数称为方法):

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

请注意,我已经切换到::,因为那是prototype更加惯用的CoffeeScript。

演示:http://jsfiddle.net/ambiguous/9Pmcr/