【问题标题】:Nest class' methods in objects, but keep instance scope在对象中嵌套类的方法,但保留实例范围
【发布时间】:2017-05-10 05:45:46
【问题描述】:

我意识到我不知道如何做一些我认为非常重要的事情,即创建一个“子类”,或者换句话说,在一个实例上创建一个嵌套对象,该对象具有引用该实例的函数。

例如,我希望能够做到这一点:

sequence = new Sequencer(2, [true, true])
sequence.is_valid # returns true or false

使用以下代码:

class Sequencer

  Validations:

    correct_sequence_length: ->
      @division == @sequence.length

    positive_length: ->
      @division > 0

  constructor: (args) ->
    { @sequence, @division } = args

  is_valid: ->
    @Validations.correct_sequence_length() &&\
    @Validations.positive_length()

但似乎因为Validations 是一个对象,它有自己的范围,并且其方法中的this 并不引用实例,而是引用Validations 对象。这意味着它无法访问@sequence@tempo。我也尝试过使用箭头函数,但它不起作用。

解决这个问题的最佳方法是让Validations 成为自己的类吗?

【问题讨论】:

  • Coffeescript 还是 ES6?请决定,它们完全不同。
  • Yes, you need an extra class 如果你想嵌套属性。
  • @Bergi 我更喜欢 coffeescript,但 v2 输出 ES6 类,所以它不一定不相关。如果您有一个适用于 ES6 但不适用于咖啡脚本的解决方案,无论如何我都会很想看到它。

标签: javascript coffeescript ecmascript-6


【解决方案1】:

是的,您需要一个包含对Sequencer 的引用的额外类:

class Sequencer

  @Validations: class
    constructor: (@target) ->

    correct_sequence_length: ->
      @target.division == @target.sequence.length

    positive_length: ->
      @target.division > 0

  constructor: ({ @sequence, @division }) ->
    @validations = new Sequencer.Validations(@)

  is_valid: ->
    @validations.correct_sequence_length() &&
    @validations.positive_length()

(为方便起见,我将其嵌套为Sequencer 的静态属性,但没有必要这样做)。


如果您不将 validations 设为对象,箭头函数将起作用:

class Sequencer

  constructor: ({ @sequence, @division }) ->

  validations: ->
#             ^^^^
    correct_sequence_length: =>
      @division == @sequence.length

    positive_length: =>
      @division > 0

  is_valid: ->
    v = @validations()
    v.correct_sequence_length() && v.positive_length()

您也可以在构造函数中使用箭头函数创建该对象:

class Sequencer

  constructor: ({ @sequence, @division }) ->
    @validations =
      correct_sequence_length: =>
        @division == @sequence.length
      positive_length: =>
        @division > 0

  is_valid: ->
    @validations.correct_sequence_length() &&
    @validations.positive_length()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 2021-10-18
    • 1970-01-01
    • 2014-02-24
    相关资源
    最近更新 更多