2008-10-23 13 views
6

Podoba mi się Prototype Pattern example Steve'a Yegge'a i postanowiłem stworzyć przykład szybkiego dowodu.W jaki sposób prototyp wzorca Yegge obsługuje zmienne instancji?

Jednak tak naprawdę nie przemyślałem. Chociaż świetnie nadaje się do dynamicznego określania zachowania obiektów i jest łatwym rozwiązaniem dla przykładu Steve'a opinionated elf, nadal próbuję znaleźć najlepszy sposób na obsługę zmiennych instancji.

Na przykład, powiedzmy, że mam obiekt AwesomeDragon. Następnie chciałbym stworzyć obiekt AwesomeDragonImmuneToFire, aby nowe dziecko z AwesomeDragon (AwesomeDragonImmuneToFire odziedziczyło właściwości z AwesomeDragon) i "wstawiło" "ImmuneToFire" jako właściwość o wartości "true". Jak na razie dobrze. Teraz załóżmy, że chcę wysłać mój obiekt AwesomeDragon na wycieczkę po pobliskich wioskach chłopskich. Będzie to wymagało aktualizacji właściwości "pozycji" AwesomeDragon. Jednak w momencie, w którym to zrobię, AwesomeDragonImmuneToFire również wystartuje.

Jest najlepszym rozwiązaniem do przesłonięcia wartości instancji podczas tworzenia obiektu, np. natychmiast "umieść" wartość "pozycji" na AwesomeDragonImmuneToFire na aktualną wartość "get" pozycji?

Odpowiedz

10

Czy to nie zależy od tego, jak faktycznie zaimplementujesz dziedziczenie w systemie?

Na przykład, w wersji JavaScriptu, co można opisać The prototype dla AwesomeDragonImmuneToFire normalnie być instancja o AwesomeDragon i odkąd zawsze pracować z przypadków, to nie ma znaczenia, co robisz do żadnego konkretnego 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 

w tym przykładzie nie ma klasy, a wszystkie przypadki są tylko przypadki Object który akurat wiem, która funkcja została wykorzystana do ich konstruowania. new to tylko a bit of syntactic sugar, a użycie funkcji StudlyCaps w funkcjach konstruktora to tylko konwencja dla funkcji, które mają być używane z new.

Kluczową rzeczą jest to, że każdy obiekt ma łańcuch prototypów, który jest badany, jeśli spróbujesz uzyskać dostęp do atrybutu, który sam w sobie nie posiada, zgodnie z opisem Yegge "Wzorzec właściwości".

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

+0

Myślałem, że idea prototypów polegała na tym, że nie było prawdziwych klas - tylko instancje klasy prototypów. Zasada hybrydowa może działać w porządku, ale myślę, że trzeba będzie sprawdzić metody obiektów i właściwości prototypów. –

+0

Dzięki za opinię przy okazji - podoba mi się twój przykład i przegłosowano. –

+0

Rzeczywiście istnieją tylko przypadki. Jednak przykład Awesome użytego jako prototyp i przykład Awesome użytego w worlflow może być inny niż w przykładzie powyżej: –

1

ta będzie obejmować aktualizowanie pozycji '' własność AwesomeDragon. Jednak w momencie, w którym to zrobię, AwesomeDragonImmuneToFire również wystartuje.

Być może źle rozumiem, ale nie jestem pewien, dlaczego uważasz, że AwesomeDragonImmuneToFire również wystartuje. Jeśli są to dwa różne obiekty, a pozycja jest własnością obiektów, to każda instancja (smok) będzie miała swoją własną pozycję. Zmiana pozycji smoka nie powinna wpływać na pozycję drugiego smoka.

+1

W prototypowych właściwościach dziedziczą z obiektu nadrzędnego.Dopóki więc nie zdefiniuję pozycji dla AwesomeDragonImmuneToFire, dziedziczy ona pozycję AwesomeDragon. –

Powiązane problemy