【问题标题】:How to pass arguments to a "sub class" in coffeescript如何将参数传递给coffeescript中的“子类”
【发布时间】:2012-02-19 13:45:49
【问题描述】:

我有以下代码在coffeescript中定义了一个迭代器原型(扩展了数组原型):

App.Utils.Iterator = do ->
  Iterator =  ->
    Array.apply(this,arguments)
    ### this.push(i) for i in arguments : works but not good practice
    iter = 0
    @reset = ->
      iter = 0
    @getIndex = ->
      iter
    @getValue= ->
      this[iter]
    @next= ->
      this[++iter] if iter < this.length-1
    @previous= ->
      this[--iter] if iter>0
    @hasNext= ->
      return if this[iter+1] then true else return false
    @hasPrevious= ->
      return  if this[iter-1]then true else return false
    return this

  Iterator.prototype = new Array()
  Iterator.prototype.constructor = Array
  return Iterator

一切正常,但是我想像数组一样实例化迭代器:

iterator = new App.Utils.Iterator(1,2,3,4)

在控制台返回 []

如何使它像普通数组一样初始化我的迭代器( new Array(1,2,3,4) 返回 [1,2,3,4] )而不在构造函数中推送参数(指令已在我的代码中评论)

谢谢

【问题讨论】:

  • 我仍在尝试理解这段代码。我还无能为力,但是您是否打算在每次调用构造函数时重新定义所有原型方法?这看起来像正在发生的事情。啊,我明白了,你这样做是为了在 iter 附近关闭。
  • @Hemlock :是的,我希望 iter 是“私有的”,这就是我这样做的原因。

标签: javascript iterator coffeescript


【解决方案1】:

您的代码中有几个设计错误,因此您尝试创建的实体不是迭代器。迭代器是您用来迭代现有数组或其他可迭代数据类型的东西 - 它不是可迭代本身。这就是为什么:

  1. 构造函数的合理参数是数组 (new Iterator [1,2,3,4])
  2. Iterator 不应扩展 Array
  3. 无需重置迭代器,只需为每次迭代创建一个新实例

现在回答你的问题。

首先,无需重新创建一堆 Javascript 样板,您的代码可以重写为:

class Iterator extends Array
  constructor: ->
    iter = 0
    @reset = ->
      iter = 0
    @getIndex = ->
      iter
    @getValue = ->
      @[iter]
    @next = ->
      @[++iter] if iter < @length-1
    @previous = ->
      @[--iter] if iter > 0
    @hasNext = ->
      if @[iter+1] then true else false
    @hasPrevious = ->
      if @[iter-1] then true else false
    super

其次,为什么仅仅为了在动态命令式语言中“隐藏”一个变量而使此类事情过于复杂并引入开销?代码必须改写为以下形式:

class Iterator extends Array
  constructor: ->
    @iter = 0
    super
  reset: ->
    @iter = 0
  getIndex: ->
    @[@iter]
  # ...

第三,不可能将参数列表传递给扩展数组。可能是[] 与糖有关的 javascript 问题。您在构造函数解决方案中推送参数的建议很好。考虑到如果您仍然坚持编写这样的课程会犯的所有其他错误,我认为良好实践的问题无论如何都不会打扰您。

附:为什么有人需要 Coffeescript 中的迭代器是一个问题。我认为你最好先阅读一些关于 Coffeescript 的书,然后再开始编写一个你不会使用的库。试试this one

【讨论】:

  • 我需要在我的程序中创建撤消 - 重做功能。这个解决方案效果很好。
  • @camus 首先,如果你想玩一个聪明的 S,你的问题是没有意义的:你不能将参数传递给子类,将它传递给超级你可以使用 super声明,如答案中所述。其次,如果您阅读它,答案既不是关于实现迭代器。第三,将您的类用于您想要的任何目的,但将其命名为 Iterator 是错误的,原因已经解释过。
  • @Volkov,你的评论没有意义,我在问一个问题,而不是聪明地玩。您提供的部分答案与该问题无关。我们不是在这里讨论命名一个类 Iterator 是否好,我可以命名我的类 foo ,没有人在乎。但是如何将参数传递给超类的构造函数并使用闭包将其应用到子类,卡皮斯?
猜你喜欢
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
相关资源
最近更新 更多