In che modo l'esempio di modello prototipo di Yegge gestisce le variabili di istanza?
-
03-07-2019 - |
Domanda
Tuttavia, non ho davvero pensato alle cose. Mentre è ottimo per specificare dinamicamente il comportamento degli oggetti ed è una soluzione facile per elfo supponente esempio, sto ancora cercando di trovare il modo migliore per gestire le variabili di istanza.
Ad esempio, supponiamo che io abbia un oggetto AwesomeDragon. Voglio quindi creare un oggetto AwesomeDragonImmuneToFire in modo da creare un nuovo figlio di AwesomeDragon (AwesomeDragonImmuneToFire eredita le proprietà da AwesomeDragon) e 'put' " ImmuneToFire " come proprietà con un valore "true". Fin qui tutto bene. Ora diciamo che voglio inviare il mio oggetto AwesomeDragon in un tour dei villaggi contadini vicini. Ciò comporterà l'aggiornamento della proprietà 'position' di AwesomeDragon. Tuttavia, nel momento in cui lo farò, anche AwesomeDragonImmuneToFire decollerà.
È la soluzione migliore per sovrascrivere i valori di istanza durante la creazione di oggetti, ad es. immediatamente "metti" il valore "posizione" su AwesomeDragonImmuneToFire sull'attuale valore "get" di "posizione"?
Soluzione
Non dipende da come si implementa effettivamente l'eredità nel proprio sistema?
Ad esempio, in una versione JavaScript di ciò che descrivi, il prototipo
per AwesomeDragonImmuneToFire
sarebbe normalmente una istanza di un AwesomeDragon
, e dato che avresti sempre lavorato con le istanze, non importa cosa faresti per qualsiasi AwesomeDragon
:
function Dragon()
{
this.position = "starting point";
}
function AwesomeDragon()
{
this.awesome = true;
}
AwesomeDragon.prototype = new Dragon();
function AwesomeDragonImmuneToFire()
{
this.immuneToFire = true;
}
AwesomeDragonImmuneToFire.prototype = new AwesomeDragon();
>>> var awesome = new AwesomeDragon();
>>> var immune = new AwesomeDragonImmuneToFire();
>>> awesome.position = "flying above village";
>>> immune.position;
"starting point"
>>> immune.awesome
true
In questo esempio, non ci sono classi e tutte le istanze sono solo istanze di Object
che capiscono quale funzione è stata usata per costruirle. new
è solo un po 'di zucchero sintattico e l'utilizzo di StudlyCaps per funzioni di costruzione è solo una convenzione per le funzioni che devono essere utilizzate con new
.
La cosa fondamentale è che ogni oggetto ha una catena di oggetti prototipo, che viene esaminata se si tenta di accedere a un attributo che l'oggetto stesso non detiene, secondo la descrizione di Yegge di ciò che il modello di proprietà " è.
https://developer.mozilla.org/en/Core_JavaScript_1.5_Gu_Det / a>
Altri suggerimenti
Ciò comporta l'aggiornamento della proprietà 'position' di AwesomeDragon. Tuttavia, nel momento in cui lo farò, anche AwesomeDragonImmuneToFire decollerà.
Forse ho frainteso ma non sono sicuro del motivo per cui pensi che anche AwesomeDragonImmuneToFire decollerà. Se sono due oggetti distinti e la posizione è una proprietà degli oggetti, ogni istanza (drago) avrà la propria posizione. La modifica della posizione di un drago non dovrebbe influire sulla posizione dell'altro.