Как правило, это будет работать без дополнительного кода; родительский конструктор используется, если явно не переопределен:
class A
constructor: ->
console.log arg for arg in arguments
class B extends A
new B('foo') # output: 'foo'
И проблема не в том, что у Array нет constructor
метода:
coffee> Array.constructor
[Function: Function]
Проблема в том, что Array
это просто странно . Хотя массивы в принципе являются «просто объектами», на практике они хранятся по-разному. Поэтому, когда вы пытаетесь применить этот конструктор к объекту, который не является массивом (даже если он проходит тест instanceof Array
), он не работает.
Итак, вы можете использовать решение Acorn, но тогда вы можете столкнуться с другими проблемами в будущем (особенно если вы передаете List
чему-то, что ожидает истинный массив). По этой причине я бы рекомендовал реализовать List
в качестве оболочки вокруг экземпляра массива, а не пытаться использовать наследование от нативного типа объекта.
Пока мы обсуждаем эту тему, одно очень важное уточнение : Когда вы используете super
само по себе, передает все аргументы! Это поведение позаимствовано у Ruby. Так
class B extends A
constructor: ->
super
передаст все аргументы конструктору A
, а
class B extends A
constructor: ->
super()
вызовет конструктор A
с без аргументов.