【问题标题】:Is there a way to define an object on the prototype based on the super class value in Coffeescript?有没有办法根据 Coffeescript 中的超类值在原型上定义一个对象?
【发布时间】:2013-08-31 19:03:46
【问题描述】:

问题

假设我在 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 

【问题讨论】:

  • 我猜你可以创建一个以Foo.foo 为原型的新对象,并添加three: 3 属性。不会像在语法上添加 three: 3 那样简洁,但从概念上讲,我认为这是您要寻找的。​​span>

标签: javascript inheritance coffeescript


【解决方案1】:

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

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

上述类定义中的@指向Bar构造函数。 Bar__super__ 属性似乎指的是Foo 的一个实例。

我想知道为什么 CoffeeScript 不将 super 视为另一个 this 关键字,而是引用超类实例?

【讨论】:

  • 我认为这是一个很好的解决方法。不是foo: _.extend @__super__.foo, three: 3吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-21
相关资源
最近更新 更多