2008-10-23 14 views
6

Ich mag Steve Yegges Prototype Pattern example und entschied mich, ein kurzes Proof-of-Concept-Beispiel zu entwickeln.Wie behandelt Yegges Prototypmusterbeispiel Instanzvariablen?

Allerdings habe ich die Dinge nicht wirklich durchdacht. Obwohl es sich hervorragend eignet, um das Verhalten von Objekten dynamisch zu bestimmen, und eine einfache Lösung für Steves opinionated elf Beispiel ist, versuche ich immer noch, den besten Weg herauszufinden, um Instanzvariablen zu handhaben.

Zum Beispiel sagen wir, ich habe ein AwesomeDragon-Objekt. Ich möchte dann ein AwesomeDragonImmuneToFire-Objekt erstellen, damit ich ein neues Kind von AwesomeDragon (AwesomeDragonImmuneToFire erbt Eigenschaften von AwesomeDragon) und "put" "ImmuneToFire" als eine Eigenschaft mit einem Wert von "True". So weit, ist es gut. Sagen wir nun, ich möchte mein AwesomeDragon-Objekt auf einer Tour durch nahe gelegene Bauerndörfer schicken. Dies beinhaltet die Aktualisierung der Eigenschaft 'position' von AwesomeDragon. In dem Moment, in dem ich das mache, wird AwesomeDragonImmuneToFire ebenfalls starten.

Ist die beste Lösung zum Überschreiben von Instanzwerten bei der Objekt-Erstellung, z. sofort den Wert 'position' auf AwesomeDragonImmuneToFire auf den aktuellen 'get' Wert von 'position' setzen?

Antwort

10

Kommt es nicht darauf an, wie Sie die Vererbung tatsächlich in Ihrem System implementieren?

Zum Beispiel in einer JavaScript-Version von dem, was Sie beschreiben, würde der prototype für AwesomeDragonImmuneToFire normalerweise eine Instanz eines AwesomeDragon, und da Sie immer mit Instanzen arbeiten würden, wäre es keine Rolle, was Sie tun zu einem bestimmten 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 diesem Beispiel gibt es keine Klassen und alle Instanzen sind nur Instanzen von Object, die sie zu konstruieren, wurde die Funktion wissen, passieren verwendet. new ist nur a bit of syntactic sugar und StudlyCaps für Konstruktorfunktionen ist nur eine Konvention für Funktionen, die mit new verwendet werden sollen.

Die Schlüssel Sache ist, dass jedes Objekt eine Kette von Prototyp-Objekten hat, die untersucht wird, wenn Sie versuchen, auf ein Attribut zuzugreifen, das das Objekt selbst nicht enthält, wie Yegge Beschreibung des "Eigenschaften-Musters" ist.

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

+0

Ich dachte, die Idee der Prototypen war, dass es keine realen Klassen gab - nur Instanzen einer Prototypklasse. Das hybride Prinzip könnte gut funktionieren, denke ich, aber ich mache mir Sorgen, dass man dann gezwungen ist, Objektmethoden und Prototypeigenschaften zu überprüfen. –

+0

Danke für die Rückmeldung übrigens - ich mag dein Beispiel und upvoted. –

+0

Es gibt tatsächlich nur Instanzen. Die Instanz von Awesome, die als Prototyp und Instanz von Awesome in worlflow verwendet wird, kann jedoch anders sein als im obigen Beispiel –

1

Dies wird die 'Position' Eigentum von AwesomeDragon beinhalten aktualisieren. In dem Moment, in dem ich das mache, wird AwesomeDragonImmuneToFire ebenfalls starten.

Vielleicht verkenne ich mich, aber ich bin nicht sicher, warum Sie denken, dass das AwesomeDragonImmuneToFire auch abheben wird. Wenn es sich um zwei unterschiedliche Objekte handelt und die Position eine Eigenschaft der Objekte ist, dann hat jede Instanz (Drache) ihre eigene Position. Das Ändern der Position eines Drachen sollte die Position des anderen nicht beeinflussen.

+1

In den Prototypmustern erben Eigenschaften vom übergeordneten Objekt.Bis ich eine Position für AwesomeDragonImmuneToFire definiere, erbt es die Position von AwesomeDragon. –