27mar 4 sposoby definiowania klasy w Javascript
O co chodzi?
W Javascript programowanie obiektowe może być zrealizowane przy pomocy różnych składni. Poniżej opiszę cztery sposoby podejścia do tematu.
Należy pamiętać, że w JS nie ma klas, tak jak w innych językach. Możemy symulować klasy przy pomocy funkcji, ale generalnie wszystko jest obiektem.
1. Funkcja
Definiujemy klasę, następnie przy pomocy słowa kluczowego new tworzymy obiekt z atrybutem color = Blue. Wywołanie metody paint powoduje przemalowanie auta na czerwony.
function Car1(color) {
this.color = color;
this.paint = function() {
this.color = 'Red';
};
}
var Car = new Car1('Blue');
Car.paint();
2. JSON
JavaScript Object Notation jest krótszym sposobem tworzenia obiektów.
Zamiast:
var obj = new Object(); var arr = new Array();
piszemy:
var obj = {};
var arr = [];
Obiekt Car2 jest równocześnie klasą, dlatego od razu po zdefiniowaniu klasy/obiektu, mamy dostęp do wszystkich atrybutów i metod.
Takie podejście realizuje wzorzec projektowy Singleton.
var Car2 = {
color : null,
paint: function() {
this.color = 'Red';
}
}
W tym samym czasie może być tylko jedna instancja Car2, nawet jeśli przepiszemy ją do zmiennej Car20 nic to nie zmieni.
var Car20 = Car2; Car2.color = 'Blue'; //Car2.color = 'Blue' //Car20.color = 'Blue' Car2.paint(); //Car2.color = 'Red' //Car20.color = 'Red'
3. Singleton używając funkcji
Trzeci sposób jest kombinacją dwóch pierwszych. Definicja klasy jest podobna jak w pierwszym przykładzie, a sposób użycia dokładnie taki sam jak w drugim.
var Car3 = new function() {
this.color = null;
this.paint = function() {
this.color = 'Red';
}
}
Car3.color = 'Blue';
Car3.paint();
4. Przestrzeń nazw
Ostatnia metoda to osadzenie klasy Car oraz metody paint w zdefiniowanej przez nas przestrzeni nazw Bodyshop.
Dzięki temu poruszamy się w jednej globalnej zmiennej Bodyshop, co mniej obciąża pamięć przeglądarki.
Dodatkowo każdy nowo tworzony obiekt odwołuje się w pamięci dokładnie do tej samej metody paint, a nie jej kolejnej kopii.
Jest to więc również realizacja wcześniej wspomnianego Singletona.
window.Bodyshop = {};
Bodyshop.Car = function init(color){
this.color = color;
}
Bodyshop.Car.prototype.paint = function() {
this.color = 'Red';
};
var Car4 = new Bodyshop.Car('Blue');
Car4.paint();
Podsumowanie
Osobiście często używam w aplikacjach drugiego z przedstawionych sposobów opartego o JSONa, szczególnie jeśli klasa zarządza zdarzeniami w obrębie jednego widoku.
Natomiast wiele bibliotek JS (jQuery, Prototype, Yahoo!) korzysta z rozwiązania opartego o przestrzeń nazw.




Grudzień 2nd, 2009 at 0:32
Zapomniałeś wspomnieć o paru rzeczach.
Najważniejsza sprawa to zakres zmiennych w JavaScript, a druga sprawa to jak klasy to gdzie zmienne prywatne i publiczne?
prosty przykładzik (zagadka):
1 var obiekt = function(){
2 var x;//prywatna
3 return {
4 get_x : function(){ return x; },
5 set_x : function(i){ x = i; }
6 }
7 }
8
9 var a = obiekt();
10 a.set_x(10);
11 print(’a.get_x() = ‘ + a.get_x());// 10
12 print(’a.x = ‘ + a.x);// undefined ???
13 a.x = 5;
14 //pytanie za sto punktów co wypiszą 2 poniższe linijki
15 print(’a.x = ‘ + a.x);
16 print(’a.get_x() = ‘ + a.get_x());
17 a.set_x(15);
18 //pytanie za dwieście punktów co wypiszą 2 poniższe linijki
19 print(’a.x = ‘ + a.x);
20 print(’a.get_x() = ‘ + a.get_x());
pozdr,
Czerwiec 24th, 2010 at 9:15
Troszkę offtop ale mnie zastanawia, ile pamięci tak naprawdę można zaadresować używając JavaScript? Czy jest to ograniczone przez przeglądarkę czy może w jakiś inny sposób narzucone.
Pozdrawiam