Pattern di ereditarietà della combinazione JavaScript

5

Nel capitolo di JavaScript professionale per sviluppatori Web su OOP, Nicholas Zachas descrive un modello di ereditarietà JavaScript che si riferisce a eredità di combinazione . L'idea di base è che i metodi siano ereditati tramite concatenamento di prototipi; mentre le proprietà dei genitori vengono passate ai discendenti chiamando il costruttore genitore all'interno del costruttore figlio.

Un piccolo esempio:

function Parent() {
    this.parentProperty;
}

Parent.prototype.parentMethod = function() {
    console.info(parentProperty);
}

function Child() {
    Parent();
}

Child.prototype = new Parent();

Conclude la sua discussione dicendo che "l'ereditarietà delle combinazioni è il modello di ereditarietà più utilizzato in JavaScript."

Tuttavia, nella sua successiva discussione sul modello di ereditarietà prototipale, egli menziona una mancanza dell'ereditarietà di combinazione, cioè che il tipo di figlio richiama il costruttore genitore due volte: una volta durante la creazione del prototipo e poi di nuovo nel costruttore.

La mia domanda è: perché il modello di ereditarietà delle combinazioni suggerisce di estendere il prototipo facendo in modo che il prototipo del bambino sia una istanza del tipo genitore, perché non dovrebbe fare riferimento al prototipo del genitore direttamente? Utilizzando l'esempio precedente, perché non fare solo quanto segue:

Child.prototype = Parent.prototype;
    
posta Isaac Kleinman 28.07.2014 - 04:42
fonte

1 risposta

1

Facendo:

Child.prototype = Parent.prototype;

Stai essenzialmente creando un riferimento al prototipo di Parent , il che significa che qualsiasi proprietà aggiunta al prototipo di Child ora viene aggiunta anche al prototipo di Parent .

D'altra parte facendo:

Child.prototype = new Parent();
Il prototipo

% diChild eredita tutte le proprietà di Parent tramite il concatenamento del prototipo, quindi l'aggiunta di una proprietà al prototipo di Child non influisce sul prototipo di Parent .

Child.prototype = Object.create(Parent.prototype);

Quanto sopra ottiene la stessa cosa eccetto che non esegue la funzione costruttore di Parent quando si crea Child ' s prototipo.

    
risposta data 07.09.2015 - 02:11
fonte

Leggi altre domande sui tag