In generale, questo funzionerebbe senza codice aggiuntivo; il costruttore genitore è usato se non espressamente sovrascritta:
class A
constructor: ->
console.log arg for arg in arguments
class B extends A
new B('foo') # output: 'foo'
E il problema non è che la matrice non ha un metodo constructor
:
coffee> Array.constructor
[Function: Function]
Il problema è solo che Array
è semplicemente strano. Mentre gli array sono "solo oggetti" in linea di principio, in pratica vengono archiviati in modo diverso. Pertanto, quando si tenta di applicare quel costruttore a un oggetto che non è un array (anche se supera il test instanceof Array
), non funziona.
Quindi, è possibile utilizzare la soluzione di Acorn, ma in questo caso è possibile che si verifichino altri problemi lungo la strada (soprattutto se si passa un List
a qualcosa che si aspetta un array vero). Per questo motivo, consiglierei di implementare List
come wrapper attorno a un'istanza dell'array, piuttosto che provare a utilizzare l'ereditarietà da un tipo di oggetto nativo.
Visto che siamo in tema, una molto importante chiarimento: Quando si utilizza super
di per sé, che fa passaggio tutti gli argomenti! Questo comportamento è preso in prestito da Ruby. Così
class B extends A
constructor: ->
super
passerà lungo tutti gli argomenti a A
'costruttore s, mentre
class B extends A
constructor: ->
super()
invocherà A
' costruttore s con senza argomenti.
fonte
2011-05-10 19:37:00
non sarebbe bello per dividere questa domanda in due separati; il primo per il passaggio generale degli argomenti del costruttore a super, il secondo sul comportamento strano di 'Array'? – Mitja