Sto riscrivendo un progetto JavaScript e voglio essere in grado di utilizzare le metodologie orientate agli oggetti per organizzare il pasticcio del codice corrente. La preoccupazione principale è che questo JavaScript debba funzionare come un widget all'interno di siti Web di terze parti e non posso farlo in conflitto con altre librerie JavaScript che altri siti Web potrebbero utilizzare.Quale sarà un buon metodo di ereditarietà Javascript minimalista?
Quindi sto cercando un modo per scrivere eredità "class-like" in JavaScript che ha i seguenti requisiti:
- Nessun librerie o cose che sarebbero in conflitto con una libreria esterna esterni (che preclude copia & incolla da una libreria esterna).
- Minimalista - Non voglio che il codice di supporto sia più grande di alcune righe di codice e non voglio che gli sviluppatori abbiano bisogno di molte piastre della caldaia ogni volta che definiscono una nuova classe o metodi.
- Dovrebbe consentire l'estensione dinamica degli oggetti padre in modo che gli oggetti figlio visualizzino le modifiche (prototipo).
- Dovrebbe consentire la concatenazione del costruttore.
- Dovrebbe consentire chiamate di tipo
super
. - Dovrebbe ancora sentire JavaScript-ish.
Inizialmente ho cercato di lavorare con semplice prototipo concatenamento:
function Shape(x,y) {
this.x = x;
this.y = y;
this.draw = function() {
throw new Error("Arbitrary shapes cannot be drawn");
}
}
function Square(x,y,side) {
this.x = x;
this.y = y;
this.side = side;
this.draw = function() {
gotoXY(this.x,this.y); lineTo(this.x+this.side, this.y); ...
}
}
Square.prototype = new Shape();
E che risolve i requisiti 1, 2 e 6, ma id non consente le chiamate super (nuove funzioni sostituiscono funzioni madri), costruttore di concatenamento e estendere dinamicamente un genitore non fornisce i nuovi metodi a una classe figlia.
Qualsiasi suggerimento sarà benvenuto.
puoi chiamare super metodi. Se definisci il disegno in Triangolo puoi ottenere un super disegno da Triangle.prototype.draw –
Il problema è che il metodo "super" non ha accesso ai campi dell'oggetto corrente - "questo" è il prototipo e non il "questo" di disegnare. Posso fare 'Square.prototype.draw.apply (this, arguments)' ma quello è clanky e normalmente non mi piacciono i metodi per chiamare il loro contenitore class per nome (dovrebbero usare 'this' ovunque). – Guss
e cosa dire di this.constructor.prototype.draw.apply (questo, argomenti) –