Javascript 如何将参数传递给";“子类”;咖啡脚本

Javascript 如何将参数传递给";“子类”;咖啡脚本,javascript,iterator,coffeescript,Javascript,Iterator,Coffeescript,我有以下代码在coffeescript中定义了迭代器原型(扩展了数组原型): 在控制台上返回[] 如何使它像常规数组一样初始化迭代器(新数组(1,2,3,4)返回[1,2,3,4]),而不在构造函数中推送参数(指令已在我的代码中注释) 谢谢您的代码中有几个设计错误,因为您试图创建的实体不是迭代器。迭代器是用于对现有数组或其他iterable数据类型进行迭代的东西—它不是iterable本身。这就是为什么: 构造函数的一个合理参数是数组(新迭代器[1,2,3,4]) 迭代器不应扩展数组 与其重置迭

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

在控制台上返回[]

如何使它像常规数组一样初始化迭代器(新数组(1,2,3,4)返回[1,2,3,4]),而不在构造函数中推送参数(指令已在我的代码中注释)


谢谢

您的代码中有几个设计错误,因为您试图创建的实体不是迭代器。迭代器是用于对现有数组或其他iterable数据类型进行迭代的东西—它不是iterable本身。这就是为什么:

  • 构造函数的一个合理参数是数组(
    新迭代器[1,2,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
    
    第三,不可能将参数列表传递给扩展数组。这可能是一个与糖相关的javascript问题。您在构造函数解决方案中推送参数所建议的方法很好。考虑到如果你仍然坚持写这样一门课,你会犯的所有其他错误,我认为良好实践的问题无论如何都不应该困扰你


    另外,为什么有人会在Coffeescript中需要迭代器是个问题。我认为你最好先读一本关于Coffeescript的书,然后再编写一个你不会用到的库。试试。

    我仍在努力理解这段代码。我还不能帮上忙,但是您是否打算在每次调用构造函数时重新定义所有的原型方法?这看起来像是正在发生的事情。啊,我明白了,你这样做是为了你能在
    iter
    @Hemlock周围有一个闭包:是的,我希望iter是“私有的”,这就是为什么我要这么做。我需要在我的程序中创建一个撤销-重做功能。这个解决方案非常有效。@camus首先,如果你想玩一个聪明的S,你的问题毫无意义:你不能将参数传递给一个子类,而要将它传递给一个超级类,你可以使用答案中描述的
    super
    语句。其次,如果您阅读了它,那么答案既不是关于实现迭代器。第三,不管你想把你的类用于什么目的,但是把它命名为迭代器是一个错误,原因已经解释清楚了。@Volkov,你的评论没有意义,我在问一个问题,不是在耍聪明。你提供的部分答案与问题无关。我们不是在这里讨论命名一个类迭代器是否好,我可以把我的类命名为foo,没有人管它。但是如何将参数传递给一个超类的构造函数,并使用闭包Capice将其应用到子类?
    iterator = new App.Utils.Iterator(1,2,3,4)
    
    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]
      # ...