Podręcznik
Podstawy Node.js
Obiekty
Obiekty są w języku JavaScript podstawowym sposobem przechowywania danych w postaci par „klucz-wartość”. Obiekt jest zbiorem własności (ang. properties). Własność obiektu może zawierać konkretną wartość (np. liczbową albo tekstową); może też być funkcją. Funkcje stanowiące własności obiektu nazywane są metodami (ang. methods) tego obiektu. Obiekty można definiować za pomocą nawiasów klamrowych { }:
name: "R2-D2",
dateCreated: new Date(),
sayHello: () => console.log("beep"),
addNumbers: (x, y) => x + y,
};
W definicji obiektu definicje kolejnych własności muszą być oddzielone przecinkami. Po ostatniej własności może (ale nie musi) się również znajdować przecinek.
Do własności obiektu – w tym również metod – można się odwoływać za pomocą wyrażeń postaci [nazwa_obiektu].[nazwa_własności]:
console.log(sum);
W ten sposób można również modyfikować własności obiektu:
...a także dodawać do obiektu nowe własności:
Za pomocą polecenia console.log można wypisać wszystkie własności obiektu:
name: 'R2-D2',
dateCreated: 1977-01-01T00:00:01.970Z,
sayHello: [Function: sayHello],
addNumbers: [Function: addNumbers],
homeworld: 'Naboo'
}
Notacja strzałkowa vs. function
Metody obiektu można definiować zarówno za pomocą notacji strzałkowej, jak i słowa function. Poniższe trzy instrukcje są równoważne:
addNumbers: (x, y) => x + y,
};
var robot = {
addNumbers: function(x, y) {
return x + y;
},
};
var robot = {
addNumbers(x, y) {
return x + y;
},
};
Między notacją strzałkową i „klasyczną” jest jednak istotna różnica: metody tworzone za pomocą notacji strzałkowej nie mają dostępu do innych własności obiektu, w którym się znajdują. Rozważmy przykład obiektu reprezentującego kwadrat o zadanych współrzędnych środka i długości boku. Obiekt ten zawiera metodę służącą do sprawdzania, czy zadany punkt znajduje się wewnątrz tego kwadratu:
center: {
x: 1.0,
y: 0.0,
},
side: 1.0,
contains: function(x, y) {
var dx = Math.abs(x - this.center.x);
var dy = Math.abs(y - this.center.y);
return ((dx <= this.side / 2) && (dy <= this.side / 2));
}
}
W powyższym fragmencie kodu, w metodzie contains wykorzystane są własności kwadratu: współrzędne środka i długość boku. Dostęp do tych własności jest możliwy za pomocą słowa this: oznacza ono obiekt, w którym jest zdefiniowana dana metoda.
Zmiana współrzędnych środka będzie odzwierciedlona w wynikach metody contains, ponieważ przy każdym wywołaniu metoda ta sięga do bieżących wartości własności kwadratu:
console.log(square.contains(0.5, 0.0));
Realizacja powyższego programu nie byłaby możliwa za pomocą notacji strzałkowej, ponieważ wewnątrz strzałkowych wyrażeń funkcyjnych nie można używać słowa this:
center: {
x: 1.0,
y: 0.0,
},
side: 1.0,
// Błąd: "this" nie działa w funkcjach strzałkowych
contains: (x, y) => (Math.abs(x - this.center.x) <= this.side / 2) &&
(Math.abs(y - this.center.y) <= this.side / 2),
}
console.log(square.contains(0.5, 0.0));
Literatura