Facendo Employee.prototype = Person.prototype è come dire "dei dipendenti è persona" piuttosto che "dei dipendenti è una persona". Eventuali modifiche a entrambi i prototipi si rifletteranno nelle classi entrambe.
Ecco uno demonstration. Ovviamente non vogliamo che le nostre persone lavorino perché non hanno una posizione.
Quindi il modo giusto di impostare la catena di prototipi senza Object.create è:
Employee.prototype = new Person;
Ma questo richiede un'istanza di un oggetto, che è un po 'eccentrico - soprattutto se non si vuole il costruttore della persona di essere chiamato. Tutte le istanze di Employee erediteranno proprietà "firstName" e "lastName" non definite, indipendentemente dal fatto che lo si desideri.
In questo caso non è un grosso problema: il costruttore Employee imposterà tali proprietà su se stesso che sostituiranno le proprietà ereditate da Person. Ma considera this example. Si potrebbe pensare che freeTime sia una proprietà a livello di istanza per Person che non verrà copiata perché non è sul prototipo. Inoltre, non abbiamo mai chiamato il Costruttore persona dall'Impiegato. Non così: freeTime era impostato sul prototipo Employee perché dovevamo istanziare un oggetto.
Quindi l'eredità migliore e più pulita che puoi fare è tramite Object.create. Se si desidera chiamare il costruttore della classe genitore, è possibile farlo esplicitamente dal costruttore della sottoclasse. Un'altra cosa bella è che Object.create ha un secondo argomento (opzionale) per definire le Proprietà. Così puoi anche fare questo:
Employee.prototype = Object.create(Person.prototype, {
work: {
value: function() {
return this.fullName+" is doing some "+this.position+" stuff");
}
}
});
Ovviamente, se devi supportare i browser legacy non puoi usare Object.create. L'alternativa è usare clone/estendere da librerie come underscore o lodash. O c'è questa piccola danza:
var subclass = function() { };
subclass.prototype = Person.prototype;
Employee.prototype = new subclass;
fonte
2013-02-23 21:00:11
Un grande [risposta] (http://stackoverflow.com/questions/15040955/javascript-oop-and-prototypes-with-multiple-level-inheritance?answertab=active# tab-top) a questo da oggi. – marekful
wow. grazie per quello segnalibro per studio! :-) –
[n.] (Http://stackoverflow.com/q/12500637/1048572) – Bergi