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żywanieObject.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:
Personto funkcja konstruktora.Person.prototypeto obiekt, który jest prototypem dla wszystkich instancji tworzonych za pomocąnew Person().sayHelloto metoda dodana do prototypu. Wszystkie instancjePersondziedziczą tę metodę.- Gdy wywołujemy
person1.sayHello(), silnik JavaScript szukasayHellowperson1. Jeśli jej nie znajdzie, odwołuje się do[[Prototype]]person1(który jest równyPerson.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.