Perché le mie proprietà dell’object JavaScript vengono sovrascritte da altre istanze?

Ho creato un object come il seguente.

var BaseObject = function(){ var base = this; base.prop; base.setProp = function(val){ base.prop = val; } } 

Quando chiamo il metodo setProp , ottengo il seguente.

 var a = new BaseObject(); var b = new BaseObject(); a.setProp("foo"); b.setProp("bar"); console.log(a.prop); // outputs 'foo' console.log(b.prop); // outputs 'bar' 

Ho quindi creato un altro object che eredita da BaseObject questo modo.

 var TestObject = function(){ // do something } TestObject.prototype = new BaseObject(); 

Quando faccio lo stesso, ottengo un risultato che non mi aspettavo.

 var a = new TestObject(); var b = new TestObject(); a.setProp("foo"); b.setProp("bar"); console.log(a.prop); // outputs 'bar' console.log(b.prop); // outputs 'bar' 

Non so perché. Recentemente ho letto molto su chiusure e eredità prototipale e sospetto che mi sia confuso tutto. Quindi qualsiasi suggerimento sul motivo per cui questo particolare esempio funziona come sarebbe molto apprezzato.

Esiste solo un’istanza BaseObject da cui ereditano tutti gli TestObject . Non usare istanze per creare catene prototipo!

Quello che vuoi è:

 var TestObject = function(){ BaseObject.call(this); // give this instance own properties from BaseObject // do something } TestObject.prototype = Object.create(BaseObject.prototype); 

Vedi ereditarietà di JavaScript: Object.create vs new , Correct javascript inheritance e Qual è il motivo per utilizzare la parola chiave ‘new’ su Derived.prototype = new Base per una spiegazione dettagliata dei problemi con new . Dai anche un’occhiata all’eredità Prototipale di Crockford – Problemi con oggetti nidificati

Pensa all’eredità protoipica trattando esclusivamente di oggetti e senza il concetto di classi. Nel tuo codice hai un object BaseObject che ha un attributo prop . Hai altri 2 oggetti che si estendono da 1 istanza di quell’object, ma la proprietà appartiene all’object originale. Se hai bisogno che ogni object abbia una propria copia, allora è necessario che venga data una variabile distinta che è intializzata per quell’object (come nel loro costruttore).

Per inciso, gli accessor in stile Java sono eccessivi in ​​JavaScript (puoi intercettare l’accesso in modo nativo se necessario) e possono ulteriormente confondere queste domande poiché si comportano in modo diverso.