javascript - mocne strony ebook,
[ Pobierz całość w formacie PDF ]
Powrót z funkcji
40
Wyjątki
40
Rozszerzanie typów
41
Rekurencja
42
Zasięg
43
Domknięcia
44
Wywołania zwrotne
47
Moduł
47
Kaskadowe łączenie wywołań
49
Funkcja curry
50
Spamiętywanie
51
5. Dziedziczenie ...............................................................................................................53
Dziedziczenie pseudoklasyczne
53
Określenia obiektów
56
Dziedziczenie prototypowe
56
Dziedziczenie funkcyjne
58
Części
61
6. Tablice .......................................................................................................................... 63
Literały tablicowe
63
Długość tablicy
64
Usuwanie elementów
65
Wyliczanie
65
Problem z rozpoznawaniem typu
65
Metody
66
Wymiary
67
7. Wyrażenia regularne ................................................................................................... 69
Przykład
70
Tworzenie
74
Elementy
75
8. Metody ......................................................................................................................... 81
9. Styl ................................................................................................................................ 97
10. Najpiękniejsze cechy języka .......................................................................................101
6
|
Spis treści
Dodatek A Kłopotliwe cechy języka .................................................................................... 105
Dodatek B Nietrafione cechy języka ..................................................................................... 113
Dodatek C JSLint .................................................................................................................... 119
Dodatek D Diagramy składni ............................................................................................... 129
Dodatek E JSON .................................................................................................................... 139
Skorowidz ............................................................................................................................. 149
Spis treści
|
7
ROZDZIAŁ 5.
Dziedziczenie
Dziedziczenie jest ważnym zagadnieniem w większości języków programowania.
W językach klasycznych (takich jak Java) dziedziczenie ma dwa główne zadania. Po pierwsze,
jest formą wielokrotnego użycia kodu. Jeśli nowa klasa jest podobna do istniejącej, wystarczy
określić dzielące je różnice. Ponowne wykorzystanie kodu jest ważne, ponieważ pozwala zmniej-
szyć koszty wytwarzania oprogramowania. Drugą zaletą dziedziczenia jest to, że zawiera ono
w sobie specyfikację systemu typów. Uwalnia to programistów w dużej mierze od konieczności
rzutowania z jednego typu na drugi, co jest istotną zaletą, ponieważ rzutowanie podważa
całą wartość bezpieczeństwa systemu typów.
JavaScript, jako język bez kontroli typów, nigdy nie wymaga rzutowania. Hierarchia dziedzi-
czenia obiektu nie ma tu znaczenia. Ważne jest, co obiekty potrafią robić, a nie po czym
dziedziczą.
JavaScript posiada dużo bogatszy zasób możliwości ponownego wykorzystania kodu. Może
naśladować klasyczne wzorce, ale dostarcza również innych, bardziej ekspresyjnych. Zbiór
możliwych wzorców dziedziczenia w JavaScripcie jest bardzo szeroki. W tym rozdziale przyj-
rzymy się kilku najprostszym przypadkom. Dużo bardziej skomplikowane są również moż-
liwe, ale zazwyczaj lepiej jest trzymać się tych najprostszych.
W klasycznych językach obiekty są instancjami klas, a klasa może dziedziczyć po innej klasie.
JavaScript jest językiem prototypowym, co oznacza, że obiekty dziedziczą bezpośrednio z in-
nych obiektów.
Dziedziczenie pseudoklasyczne
Język JavaScript ma wewnętrznie głęboko rozdartą naturę. Jego mechanizm prototypowy jest
zaciemniany przez niektóre skomplikowane elementy składni, które wyglądają bardziej kla-
sycznie. Zamiast pozwolić obiektom dziedziczyć bezpośrednio z innych obiektów, JavaScript
wprowadza niepotrzebny poziom abstrakcji, w którym obiekty tworzone są przy użyciu
funkcji konstruktorów.
Kiedy tworzony jest obiekt funkcji, konstruktor
Function
zwracający obiekt funkcji wykonuje
kod podobny do poniższego:
this.prototype = {constructor: this};
53
Nowy obiekt funkcji otrzymuje właściwość
prototype
, której wartością jest obiekt posiadający
właściwość
constructor
, której to z kolei wartością jest nowy obiekt funkcji. Obiekt
prototype
jest miejscem, gdzie złożone mają być odziedziczone właściwości. Każda funkcja otrzymuje
obiekt
prototype
, ponieważ język nie posiada sposobu określenia, które funkcje są przezna-
czone do użycia w roli konstruktorów. Właściwość
constructor
nie jest zbyt użyteczna. To
obiekt
prototype
ma znaczenie.
Kiedy funkcja jest wywoływana według wzorca wywołania konstruktora z użyciem słowa
new
, zmienia się sposób wykonania funkcji. Gdyby operator
new
był metodą, a nie operatorem,
mógłby być zaimplementowany w ten sposób:
Function.method('new', function () {
// Tworzymy nowy obiekt dziedziczący z prototypu konstruktora.
var that = Object.beget(this.prototype);
// Wywołujemy konstruktor, wiążąc this do nowego obiektu.
var other = this.apply(that, arguments);
// Jeśli zwracana wartość nie jest obiektem,
// podmień ją na nowo utworzony obiekt.
return (typeof other === 'object' && other) || that;
});
Możemy zdefiniować konstruktor i rozszerzyć jego prototyp:
var Mammal = function (name) {
this.name = name;
};
Mammal.prototype.get_name = function () {
return this.name;
};
Mammal.prototype.says = function () {
return this.saying || '';
};
Tworzymy instancję:
var myMammal = new Mammal('Mój ssak');
var name = myMammal.get_name();
// 'Mój ssak'
Następnie możemy utworzyć inną pseudoklasę dziedziczącą z
Mammal
, definiując jej konstruktor
i zastępując jej prototyp instancją
Mammal
:
var Cat = function (name) {
this.name = name;
this.saying = 'miau';
};
// Zastępujemy Cat.prototype instancją Mammal
Cat.prototype = new Mammal();
// Rozszerzamy nowy prototyp metodami purr i get_name
Cat.prototype.purr = function (n) {
var i, s = '';
for (i = 0; i < n; i += 1) {
54
|
Rozdział 5. Dziedziczenie
[ Pobierz całość w formacie PDF ]