En general, esto funcionaría sin código adicional; el constructor matriz se utiliza menos que se modifique expresamente:
class A
constructor: ->
console.log arg for arg in arguments
class B extends A
new B('foo') # output: 'foo'
Y el problema no es que la matriz no tiene un método constructor
:
coffee> Array.constructor
[Function: Function]
El problema es simplemente que es Array
simplemente extraño. Si bien las matrices son "solo objetos" en principio, en la práctica se almacenan de forma diferente. Por lo tanto, cuando intenta aplicar ese constructor a un objeto que no es una matriz (incluso si supera la prueba instanceof Array
), no funciona.
Entonces, puede usar la solución de Acorn, pero luego puede encontrarse con otros problemas en el futuro (especialmente si pasa un List
a algo que espera una verdadera matriz). Por esa razón, recomendaría implementar List
como un contenedor alrededor de una instancia de matriz, en lugar de tratar de usar la herencia de un tipo de objeto nativo.
Mientras estamos en el tema, una aclaración muy importante : Cuando se utiliza super
por sí mismo, que hace pase todos los argumentos! Este comportamiento es tomado prestado de Ruby. Así
class B extends A
constructor: ->
super
pasará a lo largo de todos los argumentos a A
's constructor, mientras
class B extends A
constructor: ->
super()
invocarán A
' s constructor con no hay argumentos.
¿No sería agradable para dividir esta pregunta en dos separados; el primero para el paso general de los argumentos constructor a super, el segundo sobre el comportamiento extraño de 'Array'? – Mitja