Sobes.tech
Middle

Czym są prototypy w JavaScript?

sobes.tech AI

Odpowiedź od AI

W JavaScript obiekty mogą dziedziczyć właściwości i metody od innych obiektów za pomocą mechanizmu prototypów. Każdy obiekt w JavaScript ma ukrytą właściwość wewnętrzną [[Prototype]], która wskazuje na inny obiekt, będący jego prototypem. Gdy odwołujemy się do właściwości lub metody obiektu, silnik JavaScript najpierw szuka jej w samym obiekcie. Jeśli jej nie znajdzie, odwołuje się do właściwości [[Prototype]] i szuka w prototypie. Proces ten powtarza się w łańcuchu prototypów, aż właściwość zostanie znaleziona lub osiągnięty zostanie null (koniec łańcucha).

Główne koncepcje:

  • Łańcuch prototypów: Sekwencja obiektów powiązanych przez właściwość [[Prototype]].
  • Dziedziczenie: Obiekty dziedziczą właściwości i metody swoich prototypów.
  • __proto__: Historycznie używana (choć nie standaryzowana początkowo) właściwość do dostępu do [[Prototype]]. Obecnie zaleca się używanie Object.getPrototypeOf().
  • prototype: Właściwość konstruktora, na którą odwołuje się [[Prototype]] w instancjach tworzonych za pomocą tego konstruktora.

Przykład z konstruktorem i prototypem:

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

// Dodanie metody do prototypu
Person.prototype.sayHello = function() {
  console.log("Cześć, nazywam się " + this.name);
};

// Tworzenie instancji
const person1 = new Person("Alice", 30);

// Wywołanie metody z prototypu
person1.sayHello(); // Wypisze: Cześć, nazywam się Alice

// Dostęp do prototypu instancji
console.log(Object.getPrototypeOf(person1) === Person.prototype); // Wypisze: true

W tym przykładzie:

  • Person to funkcja konstruktora.
  • Person.prototype to obiekt, który jest prototypem dla wszystkich instancji tworzonych za pomocą new Person().
  • sayHello to metoda dodana do prototypu. Wszystkie instancje Person dziedziczą tę metodę.
  • Gdy wywołujemy person1.sayHello(), silnik JavaScript szuka sayHello w person1. Jeśli jej nie znajdzie, odwołuje się do [[Prototype]] person1 (który jest równy Person.prototype) i znajduje metodę tam.

Prototypy umożliwiają efektywne wykorzystanie pamięci, ponieważ metody i wspólne właściwości są przechowywane w prototypie, a nie duplikowane w każdej instancji obiektu.