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 { }:

var robot = {
  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(robot.name);
R2-D2
console.log(robot.dateCreated);
2023-12-19T11:09:14.325Z
robot.sayHello();
beep
var sum = robot.addNumbers(3, 4);
console.log(sum);
7

W ten sposób można również modyfikować własności obiektu:

robot.dateCreated = new Date(1977);

...a także dodawać do obiektu nowe własności:

robot.homeworld = "Naboo";

Za pomocą polecenia console.log można wypisać wszystkie własności obiektu:

console.log(robot);
{
  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:

var robot = {
  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:

var square = {
  
  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.

console.log(square.contains(0.5, 0.0));
true

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:

square.center.y = 3.0;
console.log(square.contains(0.5, 0.0));
false

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:

var square = {
  
  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));
TypeError: Cannot read property 'x' of undefined

Literatura