如何将参数传递给coffeescript中的“子类”

时间:2012-02-19 13:45:50

标签: javascript iterator coffeescript

我有以下代码在coffeescript中定义了一个Iterator原型(扩展了Array原型):

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])而不推送构造函数中的参数(指令已经在我的代码中评论)

感谢

1 个答案:

答案 0 :(得分:-1)

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

  1. 构造函数的合理参数是数组(new Iterator [1,2,3,4]
  2. Iterator不应展开Array
  3. 而不是重置迭代器,只需为每次迭代创建一个新实例
  4. 现在回答你的问题。

    首先,在不重新创建一堆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问题。您在构造函数解决方案中推送参数的建议很好。考虑到如果你仍然坚持写这样一堂课你会犯下的所有其他错误我不认为好的练习问题应该打扰你。

    P.S。为什么有人需要在Coffeescript中使用迭代器是一个问题。我认为你应该更好地阅读一些关于Coffeescript的书,然后再深入编写一个你不会使用的库。试试this one