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