Referencje

edytuj

W języku JavaScript wszystko co nie jest typem prostym (jak liczba lub ciąg znaków) jest obiektem. Obiekty w odróżnieniu od typów prostych nie są kopiowane gdy są przypisywane do zmiennych lub przekazywane do funkcji ale są przekazywane przez referencje, czyli jest przekazana wskazanie na dany obiekt a nie sam obiekt.

Można użyć kilka sposobów aby utworzyć obiekt:

obiekt wstawiony

edytuj

Można utworzyć obiekt bezpośrednio wstawiony w kodzie:

var person = {
   name: "Jan",
   age: 21
};

W tym przypadku name i age są to właściwości, do których można się odwołać za pomocą operatora kropki:

console.log(person.name + ' ma ' + person.age + ' lat');

Obiekty mogą mieć metody, czyli funkcje jako właściwości

var person = {
   name: "Jan",
   age: 21,
   greet: function(message) {
      return message + ' ' + this.name;
   }
};

Funkcja jako metody obiektów mają dostęp do specjalnej zmiennej (jest to słowo kluczowe) this, które wskazuje na dany obiekt. Obiekt na który wskazuje this, nazywany jest kontekstem funkcji. Kontekst funkcji można zmienić dynamicznie.

obiekt wstawiony zagnieżdżony

edytuj

Obiekty zagnieżdżone można dowolnie zagnieżdżać, to znaczy że właściwością może być typ prosty jak i każda inna wartość:

var person = {
   name: "Jan",
   age: 21,
   address: {
     street: "Tatarska",
     number: "22/7"
   }
};

Konstruktor

edytuj

Obiekty można tworzyć za pomocą funkcji konstruktora.

function Person(name, age) {
   this.name = name;
   this.age = age;
}

oraz operatora new, który utworzy nową instancje obiektu:

var jan = new Person("Jan", 21);
console.log(jan.name + " ma " + jan.age + " lat");

Dzięki operatorowi instanceof można sprawdzić czy obiekt został stworzony przez dany konstruktor, (tzn. czy jest jego instancją):

var jan = new Person("Jan", 21);
console.log(jan instanceof Person); // true

Prototypy

edytuj

W odróżnieniu od języków takich jak C++ czy Java. Podstawowym sposobem programowania obiektowego w języku JavaScript są prototypy. W języku JavaScript obiekty dziedziczą po innych obiektach, które nazywane są prototypami. Dzięki prototypom obiekty mogą współdzielić przez referencje różne właściwości np. metody:

function Person(name, age) {
   this.name = name;
   this.age = age;
}
Person.prototype.greet = function(message) {
   console.log(this.name + ' mówi: ' + message);
};

Funkcja greet jako metoda będzie dostępna w każdej instancji obiektu Person.

var jan = new Person('Jan', 21);
var karol = new Person('Karol', 29);
jan.greet('Hej'); // Jan Mówi: Hej
karol.greet('Co tam'); // Karol mówi: Co tam

Prototypy oraz ich połączenie jest żywe, tzn. gdy zmienimy prototyp każda instance która była utworzona przed tą zmianą będzie miała dostęp do tej zmiany:

var jan = new Person('Jan', 21);
var karol = new Person('Karol', 29);
Person.prototype.greet = function() {
   console.log('Jestem ' + this.name);
};
jan.greet(); // Jestem Jan
karol.greet(); // Jestem Karol

W wersji ES6 (ES2015) powstała nowa składnia klas, znana z takich języków jak Java czy C++.