Sono corretto nel presupporre che l'Opzione 2 risultati nel cestinare alcune funzioni che sono implicitamente legate al prototipo?
Sì, esattamente. Sebbene l'unica proprietà implicitamente legata sia la proprietà constructor
, di cui raramente hai bisogno.
Quali sono le differenze funzionali?
L'opzione 1 sta semplicemente estendendo il prototipo esistente.Se ci sono già istanze Person
che ereditano dall'oggetto prototipo, saranno in grado di utilizzare anche il metodo sayName
. Con l'opzione 2, il nuovo prototipo verrà utilizzato solo per oggetti istanziati dopo la sovrascrittura.
Ci sono dei vantaggi nello scegliere l'uno rispetto all'altro?
Questi dovrebbero essere auto-esplicativi ora. L'opzione 1 (estensione) è considerata più pulita, ed è un must se stai modificando prototipi stranieri/sconosciuti/nativi. Cercate di evitare l'opzione 2.
Se ti piace ancora la sintassi letterale oggetto meglio, si dovrebbe considerare l'utilizzo di Object.assign
di estendere il prototipo esistente:
Object.assign(Person.prototype, {
sayName: function(name) {
alert(name);
}
});
Potrebbe essere necessario polyfill Object.assign
per gli ambienti di pre-ES6. In alternativa, $.extend
o _.extend
funzionano altrettanto bene. Sicuramente anche la tua libreria preferita ha una funzione di supporto per questo.
Vedere anche [Qual è la differenza tra queste dichiarazioni di prototipo?] (Http://stackoverflow.com/questions/16773061/what-is-the-difference-between-these-prototype-declaration) – Bergi