16 marca 2009
E4X
Paradygmat klasowy Klasa Deniuje wszystkie wªa±ciwo±ci charakterystyczne dla wybranego zbioru obiektów. Klasa jest poj ciem abstrakcyjnym odnosz cym si do zbioru, a nie do pojedynczego elementu. Obiekt Jest konkretnym elementem zbioru obiektów.
Paradygmat prototypowy Prototyp W paradygmacie prototypowym nie wyst puje rozró»nienie na klasy i obiekty. Ka»dy obiekt mo»e mie zdeniowany prototyp z którego czerpie pocz tkowe warto±ci dla swoich pól. Obiektom mog by nadawane wªa±ciwo±ci w momencie ich tworzenia lub w trakcie pó¹niejszego dziaªania programu.
Deniowanie klas Klasa Klasa jest oddzielnym bytem. Deniuje pola i wyró»nion funkcj b d c konstruktorem. Prototyp Konstuktor i klasa jest tym samym. Ka»da funkcja mo»e by u»yta jako konstruktor.
Podklasy i dziedziczenie Klasa Klasa mo»e mie nadklas lub nadklasy. Jest to niezale»ne od istnienia jakichkolwiek obiektów. Prototyp Tworzymy konstruktory podklasy i nadlasy, a nast pnie mówimy,»e prototypem konstruktora podklasy, jest obiekt nadklasy.
Dodawanie i usuwanie wªa±ciwo±ci Klasa Klasa deniuje zbiór wªa±ciwo±ci, który jest niezmienny. Prototyp Wªa±ciwo±ci obiektów mo»na dodawa i usuwa w dowolnym momencie.
Podsumowanie ró»nic Klasy Klasy i obiekty to ró»ne rzeczy Denicja i konstruktor s odr bne Obiekty tworzy si przez new Istnieje hierarchia klas po nadklasie Klasa deniuje wszystkie wªa±ciwo±ci Prototyp Klasy i obiekty s tym samym Denicja i konstruktor jest tym samym Tak same Istniej prototypy po prototypie Wªa±ciwo±ci mo»na dodawa w dowolnym momencie
Przykªad Employee ma wªa±ciwo±ci name i dept Manager ma wªa±ciwo± reports WorkerBee ma wªa±ciwo± projects SalesPerson ma wªa±ciwo± quota, nadpisuje dept Engineer ma wªa±ciwo± machine, nadpisuje dept
Implementacja przykªadu
Tworzenie obiektu z prototypem Po wykonaniu mark = new WorkerBee ; mark ma nast puj ce wªa±ciwo±ci mark. name = " " ; mark. dept = " g e n e r a l " ; mark. p r o j e c t s = [ ] ; dodatkowo mark. proto wskazuje na WorkerBee.prototype
Zmiana wªa±ciwo±ci obiektu mark. bonus = 3 0 0 0 ; Employee. p r o t o t y p e. s p e c i a l t y = " none " ; E n g i n e e r. p r o t o t y p e. s p e c i a l t y = " code " ; Pole bonus ma tylko obiekt mark. Pole specialty maj wszystkie obiekty dziedzicz ce po Employee. polega na szukaniu pierwszego prototypu zawieraj cego wªa±ciwo±.
f u n c t i o n Employee ( name, dept ) { t h i s. name = name " " ; t h i s. dept = dept " g e n e r a l " ; } f u n c t i o n WorkerBee ( p r o j s ) { t h i s. p r o j e c t s = p r o j s [ ] ; } WorkerBee. p r o t o t y p e = new Employee ; przyjmuj parametry Zwró my uwag na idiom
Konstruktor - dziwny przypadek f u n c t i o n E n g i n e e r ( name, p r o j s, mach ) { t h i s. base = WorkerBee ; t h i s. base ( name, " e n g i n e e r i n g ", p r o j s ) ; t h i s. machine = mach " " ; } j a n e = new E n g i n e e r (" Doe, Jane ", [ " n a v i g a t o r ", " j a v a s c r i p t " ], " b e l a u " ) ; Employee. p r o t o t y p e. s p e c i a l t y = " none " ; jane nie ma pola specialty base to po prostu funkcja! gdyby±my mieli Engineer.prototype = new WorkerBee, to jane miaªaby specialty
Poszukiwanie wªa±ciwo±ci Algorytm poszukiwania wªa±ciwo±ci wygl da tak 1. je±li obiekt deniuje wªa±ciwo±, to j zwró 2. je±li nie, to sprawd¹ ªa«cuch prototypów (u»ywaj c proto ) 3. je±li który± obiekt w ªa«cuchu deniuje wªa±ciwo±, to zwró pierwsz z nich 4. w przeciwnym wypadku obiekt nie ma wªa±ciwo±ci
Poszukiwanie wªa±ciwo±ci - dziwny przypadek f u n c t i o n Employee ( ) { t h i s. name = " " ; } f u n c t i o n WorkerBee ( ) { } WorkerBee. p r o t o t y p e = new Employee ; amy = new WorkerBee ; Employee. p r o t o t y p e. name = "Unknown" Co to jest amy.name? A gdyby zamiast this.name = byªo Employee.prototype.name =?
Jak dziaªa instanceof? c h r i s = new E n g i n e e r (" Pigman, C h r i s ", [ " j s d " ], " f i j i " ) ; c h r i s. proto == E n g i n e e r. p r o t o t y p e ; c h r i s. proto. proto == WorkerBee. p r o t o t y p e ; c h r i s. proto. proto. proto == Employee. p r o t o t y p e ; c h r i s. proto. proto. proto. proto == O b ject. p r o t o t y p e ; c h r i s. proto. proto. proto. proto. proto == n u l l ; i n s t a n c e O f ( c h r i s, E n g i n e e r ) == t r u e i n s t a n c e O f ( c h r i s, WorkerBee ) == t r u e i n s t a n c e O f ( c h r i s, Employee ) == t r u e i n s t a n c e O f ( c h r i s, O bject ) == t r u e i n s t a n c e O f ( c h r i s, S a l e s P e r s o n ) == f a l s e instanceof sprawdza, czy funkcja jest w ªa«cuchu prototypów.
Kiedy woªany jest konstruktor? v a r i d C o u n t e r = 1 ; f u n c t i o n Employee ( ) { t h i s. i d = i d C o u n t e r ++; } f u n c t i o n Manager ( name, dept, r e p o r t s ) {... } Manager. p r o t o t y p e = new Employee ; f u n c t i o n WorkerBee ( name, dept, p r o j s ) {... } WorkerBee. p r o t o t y p e = new Employee ; f u n c t i o n E n g i n e e r ( name, p r o j s, mach ) {... } E n g i n e e r. p r o t o t y p e = new WorkerBee ; mac = new E n g i n e e r ("Wood, Mac " ) ; Po wywoªaniu tego kodu mac.id == 4
Domkni cia f u n c t i o n makefunc ( ) { v a r name = " M o z i l l a " ; f u n c t i o n displayname ( ) { a l e r t ( name ) ; } r e t u r n displayname ; } v a r myfunc = makefunc ( ) ; myfunc ( ) ; Opis Niby funkcji makefunc nie ma, a makefunc.name jest. Bo to jest domkni cie.
Domkni cia f u n c t i o n makeadder ( x ) { r e t u r n f u n c t i o n ( y ) { r e t u r n x + y ; } ; } v a r add5 = makeadder ( 5 ) ; v a r add10 = makeadder ( 1 0 ) ; p r i n t ( add5 ( 2 ) ) ; // 7 p r i n t ( add10 ( 2 ) ) ; // 12 Opis Program wy±wietli kolejno 7 i 12.
Enkapsulacja v a r Counter = ( f u n c t i o n ( ) { v a r p r i v a t e C o u n t e r = 0 ; f u n c t i o n changeby ( v a l ) { p r i v a t e C o u n t e r += v a l ; } r e t u r n { i n c r e m e n t : f u n c t i o n ( ) { changeby ( 1 ) ; }, decrement : f u n c t i o n ( ) { changeby ( 1); }, v a l u e : f u n c t i o n ( ) { r e t u r n p r i v a t e C o u n t e r ; } } } ) ( ) ; a l e r t ( Counter. v a l u e ( ) ) ; / A l e r t s 0 / Counter. i n c r e m e n t ( ) ; Counter. i n c r e m e n t ( ) ; a l e r t ( Counter. v a l u e ( ) ) ; / A l e r t s 2 / Counter. decrement ( ) ; a l e r t ( Counter. v a l u e ( ) ) ; / A l e r t s 1 /
Problemy z domkni ciami Niekiedy domkni cia zachowuj si nieintuicyjnie, zwªaszcza je±li do ich tworzenia u»ywamy p tli. Przykªad: closure_problem.html Rozwi zanie Rozwi zaniem jest u»ycie let