È giusto assegnare l’object prototipo JavaScript anziché solo le sue proprietà?

In JavaScript possiamo assegnare proprietà al prototipo di una funzione o impostare direttamente il suo object prototipo:

var MyClass = function() { }; // The "property" form... MyClass.prototype.foo = function() { ... }; MyClass.prototype.bar = function() { ... }; MyClass.prototype.gah = function() { ... }; // OR the "assignment" form... MyClass.prototype = { foo:function() { ... }, bar:function() { ... }, gah:function() { ... } }; 

Personalmente preferisco il modulo di assegnazione perché puoi facilmente avvolgere l’object in una chiusura (ad esempio per hide oggetti “privati”) e se in seguito decidi di cambiare il nome di “MyClass” devi solo trovare due punti invece che potenzialmente dozzine. (Naturalmente, lo stesso potrebbe essere detto per il modulo “proprietà” usando e chiamando una funzione che considera il prototipo esistente come un argomento, ma il modulo “assegnazione” sembra più diretto a mio parere.)

C’è una forte ragione per usare un modulo invece dell’altro?

[Modificare]

Come commenta @Raynos, il secondo modulo (assegnazione) clobbers l’attributo prototype.constructor , che dovrebbe essere impostato sulla funzione MyClass (ed è di default nella prima forma [proprietà]). Ci sono dei veri svantaggi in questo (a parte il fatto che la proprietà non è impostata)?

La ragione principale per non utilizzare il secondo modulo è che finirai per eliminare qualsiasi altra cosa esistente nel prototipo prima di assegnarlo. Se questo non è qualcosa di cui ti preoccupi, non c’è motivo di non dichiararlo come hai dimostrato.

Penso che ci sia un altro inconveniente nell’usare il modulo “assegnazione” alla proprietà del prototype : probabilmente prototype.__proto__ proprietà prototype.__proto__ (catena del prototipo) quando hai a che fare con l’ereditarietà “pseudo-classica”.

Naturalmente, si potrebbe obiettare che esiste un modo per rimediare a questo, che è quello di albind la proprietà __proto__ per colbind nuovamente la catena. Ma dimenticando di fare questo si romperà il codice se si chiama il metodo genitore. Guarda il mio violino qui: http://jsfiddle.net/glenn/v5Yub/

Conclusione: il modulo “assegnazione” potrebbe sembrare più semplice / pulito, ma la forma “proprietà” è più sicura.