有没有办法根据Coffeescript中的超类值在原型上定义一个对象?

时间:2013-08-28 15:41:15

标签: javascript inheritance coffeescript

问题

假设我在CS中有以下课程

class Foo
  foo:
    one: 1
    two: 2

我希望class Bar extends Foo foo属性返回{one: 1, two: 2, three: 3}。我是否可以在Bar的类定义中执行此操作,我只将three: 3附加到超类foo上已存在的Foo属性中?

用例/解决方法

我很好奇是否有可能像我上面解释的那样做。但是,由于我的用例,它不是阻塞问题,因为我可以使用Coffeescript的super调用来解决它的问题。

我目前正在使用Backbone,我有两个课程。一个继承自Backbone.Model,另一个继承自第一个类。在第一个类中,我设置defaults属性,以便在创建此模型时,如果未传入实例变量,则设置实例变量。从第一个类继承的类有一个额外的键值对添加到此defaults对象虽然如果我想覆盖默认值,情况会相同。

Backbone中对象的默认值是通过使用Underscore的result方法获得的,因此在这种情况下快速解决方法是简单地使defaults函数返回相同的对象。在Coffeescript中,这非常容易,变成:

class Foo
  foo: ->
    one: 1
    two: 2

然后在Bar中,您可以执行以下操作:

class Bar extends Foo
  foo: ->
    _.extends super, three: 3 

1 个答案:

答案 0 :(得分:1)

虽然在CoffeeScript中,super关键字严格用于调用父方法,但该语言似乎并未隐藏__super__“静态”变量。让我们充分利用它。

class Bar extends Foo
  foo: _.extend @__super__.foo, three: 3

上面类定义中的@指向Bar构造函数。 Bar的{​​{1}}属性似乎是指__super__的一个实例。

我想知道为什么CoffeeScript不像其他Foo关键字一样对待super,而是为了引用超类实例?