Ho riflettuto un po 'su come eseguire OOP in JS, specialmente quando si tratta di incapsulamento ed ereditarietà, di recente.
Secondo Crockford, la classica è dannosa a causa di new (), e sia prototipale che classica sono limitati perché il loro uso di constructor.prototype significa che non puoi usare chiusure per l'incapsulamento.
Recentemente, ho preso in considerazione i seguenti due punti sull'incapsulamento:
-
Incapsulamento uccide le prestazioni . Ti consente di aggiungere funzioni a OGNI oggetto membro anziché al prototipo, poiché i metodi di ciascun oggetto hanno chiusure diverse (ogni oggetto ha membri privati diversi).
-
L'incapsulamento impone la brutta "var that = this" soluzione alternativa, in modo che le funzioni di helper private abbiano accesso all'istanza a cui sono associate. In alternativa, o assicurati di chiamarli con privateFunction.apply (this) everytime.
Esistono soluzioni alternative per uno dei due problemi citati? in caso contrario, consideri ancora l'incapsulamento come meritevole?
Sidenote: il modello funzionale descritto da Crockford non consente nemmeno di aggiungere metodi pubblici che toccano solo membri pubblici, poiché rinuncia completamente all'uso di new () e constructor.prototype. Non sarebbe un approccio ibrido in cui usi l'ereditarietà classica e new (), ma chiami anche Super.apply (questo, argomenti) per inizializzare membri privati e metodi privilegiati, essere superiore?