2008-10-23 16 views
6

Mi piace il Prototype Pattern example di Steve Yegge e ho deciso di creare un esempio di prova rapida.In che modo l'esempio di modello prototipo di Yegge gestisce le variabili di istanza?

Tuttavia, non ho davvero pensato alle cose. Sebbene sia ottimo per specificare dinamicamente il comportamento degli oggetti ed è una soluzione facile per l'esempio di Steve opinionated elf, sto ancora cercando di trovare il modo migliore per gestire le variabili di istanza.

Ad esempio, supponiamo di avere un oggetto AwesomeDragon. Quindi voglio creare un oggetto AwesomeDragonImmuneToFire in modo da creare un nuovo figlio di AwesomeDragon (AwesomeDragonImmuneToFire eredita le proprietà da AwesomeDragon) e "mettere" "ImmuneToFire" come una proprietà con un valore di "true". Fin qui tutto bene. Ora diciamo che voglio inviare il mio oggetto AwesomeDragon in un tour dei villaggi rurali vicini. Ciò comporterà l'aggiornamento della proprietà 'position' di AwesomeDragon. Tuttavia, il momento in cui faccio questo AwesomeDragonImmuneToFire decollerà.

È la soluzione migliore per sovrascrivere i valori di istanza alla creazione dell'oggetto, ad es. immediatamente 'metti' il valore 'posizione' su AwesomeDragonImmuneToFire sul valore corrente 'ottieni' di 'posizione'?

risposta

10

Non dipende da come si implementa effettivamente l'ereditarietà nel proprio sistema?

Ad esempio, in una versione JavaScript del ciò che si descrive, il prototype per AwesomeDragonImmuneToFire sarebbe normalmente essere un esempio di un AwesomeDragon, e dal momento che si sarebbe sempre lavorare con le istanze, non avrebbe importanza quello che fai ad una particolare 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 esempi di Object che capita di sapere quale funzione è stato utilizzato per la loro costruzione. new è solo a bit of syntactic sugar e usare StudlyCaps per le funzioni di costruzione è solo una convenzione per le funzioni che devono essere utilizzate con new.

L'elemento chiave è 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 contiene, come da descrizione di Yegge su cosa sia il "Pattern proprietà".

https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Details_of_the_Object_Model

+0

Ho pensato che l'idea dei prototipi fosse che non esistevano classi reali: solo le istanze di una classe prototipo. Il principio ibrido potrebbe funzionare a dovere credo, ma temo che siate costretti a controllare i metodi degli oggetti e le proprietà dei prototipi. –

+0

Grazie per il feedback, a proposito: mi piace il tuo esempio e ho votato in su. –

+0

Ci sono davvero solo istanze. Tuttavia, l'istanza di Awesome utilizzata come prototipo e l'istanza di Awesome utilizzata in worlflow può essere diversa come nell'esempio sopra –

1

Ciò comporterà l'aggiornamento della proprietà 'position' di AwesomeDragon. Tuttavia, il momento in cui faccio questo AwesomeDragonImmuneToFire decollerà.

Forse mi fraintendono, ma io non sono sicuro perché si ritiene che l'AwesomeDragonImmuneToFire decollerà pure. Se sono due oggetti distinti e la posizione è una proprietà degli oggetti, ciascuna istanza (drago) avrà la propria posizione. Cambiare la posizione di un drago non dovrebbe influire sulla posizione dell'altro.

+1

Nelle proprietà del modello prototipo ereditate dall'oggetto padre.Quindi finché non definisco una posizione per AwesomeDragonImmuneToFire eredita la posizione di AwesomeDragon. –