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 obiektem, 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 (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ć tylko wywołana 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: 13.03.2007, 04:30