oggetti JavaScript e Crockford's The Good Parts

8

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:

  1. 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).

  2. 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?

    
posta Jonathan 01.11.2012 - 12:25
fonte

1 risposta

2

L'incapsulamento è davvero complicato e probabilmente non vale la pena in JavaScript. Un metodo che funziona e fa tutto ciò che vorresti (campi privati, accesso alla superclasse e metodi privati) sarebbe questa (probabilmente molto brutta e improvvisabile) soluzione:

function SomeClass() {

    var parent = SomeSuperClass(),
        somePrivateVar;

    return Object.create(parent, {
        somePrivateVar: {
            get: function() {
                return somePrivateVar;
            },
            set: function(value) {
                somePrivateVar = value;
            }
        },
        doSomething: {
            value: function(data) {
                someHelperFunction.call(this, data);
            }
        }
    });
}

function someHelperFunction(data) {
    this.someMethod(data);
}

Questo tipo di opere, ti permette di avere campi e metodi e eredità privati come ci si aspetterebbe. Tuttavia, non mi piace - ma mi piace la migliore di tutte le possibilità che hai in puro JavaScript.

Se dovessi avviare un nuovo progetto con molto JavaScript, probabilmente dare un'occhiata più da vicino a TypeScript . Migliora JavaScript in caso di necessità (IMHO), fornisce tipizzazione statica, ereditarietà, incapsulamento e tutto il resto .. Ma dopotutto è solo JavaScript.

Ora ne vale la pena? Penso che ci siano due cose importanti da considerare. Incapsulamento probabilmente ti aiuta in fase di sviluppo, ma certamente non in fase di runtime. Penso che tu debba decidere; Nessun incapsulamento e prestazioni migliori, o incapsulamento, codice non molto bello, probabilmente un design migliore ma un certo overhead in fase di runtime.

    
risposta data 01.11.2012 - 14:25
fonte

Leggi altre domande sui tag