Klasy i obiekty w Javascript
Każda funkcja może zostać wywołana operatorem new i staje się wtedy konstruktorem obiektu.
function Obiekt(){this.hello = "World!"}var obiekt = new Obiekt();alert(obiekt.hello);
Operator new utworzy nowy obiekt z prototypu i wywoła funkcję Obiekt w jego kontekście (this będzie wskazywał na ten nowy obiekt).
W JS nie ma formalnie klas i podziału na metody publiczne lub prywatne, ale dzięki elastyczności i wszechstronności jego funkcji można uzyskać funkcjonalność znaną z Javy lub C++.
Prototypy
JS tworzy obiekty na podstawie prototypów. Każdy nowy obiekt jest kopią wcześniej stworzonego wzoru — prototypu.
Prototyp jest umieszczony w polu prototype funkcji (w JS funkcje są jednocześnie obiektami, dlatego mogą zawierać definicje klas) używanej jako konstruktor:
var NowaKlasa = function(){}/* tworzy (pusty) konstruktor dla klasy NowaKlasa */NowaKlasa.prototype.hello = "hello world!"/* dodaje pole hello do prototypu klasy */var k = new NowaKlasa()/* zmienna k jest nową instancją klasy NowaKlasa */alert(k.hello)Wyświetli „hello world!”
Metody i pola publiczne
Wszystkie pola (a zatem i metody) obiektu są publiczne.
Metody i pola prywatne oraz uprzywilejowane
Dla uzyskania funkcjonalności metod i pól prywatnych używa się zmiennych i funkcji tworzonych wewnątrz konstruktora. Dzięki temu ich widoczność jest ograniczona tylko do konstruktora klasy, a każdy obiekt ma ich kopię.
function Obiekt(){function tajna() {alert('Jest tajna');}}
Klasa Obiekt z prywatną metodą tajna, która może być wywołana tylko przez konstruktor i metody stworzone w konstruktorze.
var o = new Obiekt(); o.tajna();
Powyższy kod nie zadziała. tajna nie jest polem obiektu, a zmienną wewnątrz konstruktora.
Obiekt.prototype.publiczna = function(){tajna();} /*tworzenie nowej metody w prototypie klasy Obiekt*/var o = new Obiekt(); o.publiczna();
Ten kod też nie zadziała. publiczna została stworzona poza konstruktorem.
Dostęp do prywatnych metod i pól
Ponieważ prywatne pola i metody są widoczne tylko wewnątrz konstruktora, nie są też widoczne dla metod stworzonych poza nim (np. przez prototyp).
Metody, które mają mieć dostęp do prywatnych pól i metod, muszą zostać stworzone w konstruktorze:
function Obiekt(){function tajna() {alert('Jest tajna');}this.uprzywilejowana = function(){tajna();}}
var o = new Obiekt(); o.uprzywilejowana();
Powyższy kod zadziała. uprzywilejowana jest metodą obiektu i ma jednocześnie dostęp do zmiennych wewnątrz konstruktora.
Zmodyfikowano: 21.11.2008, 01:25