В вашем коде есть несколько ошибок проектирования, из-за которых сущность, которую вы пытаетесь создать, не является итератором.Итератор - это то, что вы используете для итерации по существующему массиву или другому итерируемому типу данных - это не итерация сама по себе.Вот почему:
- разумным параметром для вашего конструктора является массив (
new Iterator [1,2,3,4]
) Iterator
не должен расширяться Array
- вместо сбросаитератор просто создает новый экземпляр для каждой итерации
Теперь к вашему вопросу.
Во-первых, без воссоздания набора шаблонов 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, связанная с []
.Предложенное вами выдвижение аргументов в конструкторе решения прекрасно.Учитывая все другие ошибки, которые вы допустите, если будете продолжать писать такой класс, я не думаю, что вопрос хорошей практики все равно должен вас беспокоить.
PS Почему кому-то понадобится итератор в Coffeescriptэто вопрос.Я думаю, вам лучше прочитать какую-нибудь книгу о Coffeescript, прежде чем углубляться в программирование библиотеки, которую вы не будете использовать.Попробуйте этот .