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 Bug w IE6

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.publiczna = function(){tajna();}
 }
var o = new Obiekt; o.publiczna();

Powyższy kod zadziała. publiczna jest metodą obiektu i ma jednocześnie dostęp do zmiennych wewnątrz konstruktora.


Zmodyfikowano: 03.09.2015, 04:53
submit