В программе CoffeeScript ниже я создаю подкласс Array
, который устанавливает две позиции в своем конструкторе:
class SetPositionsArray extends Array
constructor: (x,y) ->
@[0] = x
@[1] = y
myLength: ->
@length
sp_array = new SetPositionsArray 1, 2
console.log "sp_array: "
console.log sp_array
console.log "sp_array[0]: "
console.log sp_array[0]
console.log "sp_array[1]: "
console.log sp_array[1]
console.log "sp_array.length: "
console.log sp_array.length
console.log "sp_array.myLength(): "
console.log sp_array.myLength()
Я бы надеялся, что этот код изменит свойство length
на sp_array
, так как он эффективно устанавливает позиции на нем. Тем не менее, вывод, который я получаю:
$ coffee sp.coffee
sp_array:
[ 1, 2 ]
sp_array[0]:
1
sp_array[1]:
2
sp_array.length:
0
sp_array.myLength():
0
То есть длина равна 0.
Затем я создал другой класс, который вместо значений устанавливает значения в экземпляре:
class PushValuesArray extends Array
constructor: (x,y) ->
@push x
@push y
myLength: ->
@length
pv_array = new PushValuesArray 1, 2
console.log "pv_array: "
console.log pv_array
console.log "pv_array[0]: "
console.log pv_array[0]
console.log "pv_array[1]: "
console.log pv_array[1]
console.log "pv_array.length: "
console.log pv_array.length
console.log "pv_array.myLength(): "
console.log pv_array.myLength()
В этом случае я получаю ожидаемый результат, за исключением того, что в массиве есть фактический length
атрибут (хотя я бы предположил, что это будут некоторые внутренние детали):
$ coffee pv.coffee
pv_array:
[ 1, 2, length: 2 ]
pv_array[0]:
1
pv_array[1]:
2
pv_array.length:
2
pv_array.myLength():
2
Итак, почему установка позиции в массиве не меняет его длину?
Этот вопрос относится к этому , для которого я отправил этот ответ .