W JavaScript, mechanizmy dziedziczenia i tworzenia łańcuchów prototypów mogą być źródłem zamieszania, szczególnie gdy przychodzi do rozróżnienia między __proto__
a prototype
. Obie te właściwości są związane z prototypami, ale pełnią różne role w kontekście dziedziczenia i instancjonowania obiektów.
__proto__
vs prototype
__proto__
: Jest to właściwość, która istnieje na każdym obiekcie i wskazuje na prototyp obiektu, z którego dany obiekt dziedziczy metody i właściwości. Innymi słowy,__proto__
zawiera referencję do prototypu obiektu, który był użyty jako szablon do stworzenia instancji obiektu.prototype
: Jest to właściwość specyficzna dla funkcji konstruktora. Każda funkcja w JavaScript ma właściwośćprototype
, która jest używana, gdy funkcja ta jest wywoływana z operatoremnew
do stworzenia nowej instancji obiektu. Właściwośćprototype
zawiera obiekt, który będzie przypisany do__proto__
nowo stworzonych obiektów.
Przykład z kodem
Aby lepiej zrozumieć różnicę między __proto__
a prototype
, przeanalizujmy poniższy przykład:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>__proto__ vs prototype</title>
</head>
<body>
<script>
// Funkcja konstruktora dla Car
function Car(brand, model) {
this.brand = brand;
this.model = model;
}
// Dodajemy metodę do prototypu Car
Car.prototype.getDetails = function() {
return `${this.brand} ${this.model}`;
};
// Tworzymy nową instancję Car
const myCar = new Car("Ford", "Mustang");
// Użycie metody z prototypu
console.log(myCar.getDetails()); // Wyświetla "Ford Mustang"
// Dostęp do prototypu przez __proto__
console.log(myCar.__proto__ === Car.prototype); // true
// Dostęp do prototypu konstruktora
console.log(Car.prototype);
// Sprawdzamy, czy __proto__ myCar wskazuje na Car.prototype
console.log(myCar.__proto__ === Car.prototype); // true
</script>
</body>
</html>
W tym przykładzie, funkcja Car
jest używana jako konstruktor do tworzenia nowych obiektów typu Car
. Dodajemy metodę getDetails
do prototypu Car
, co oznacza, że każda instancja stworzona przez Car
będzie miała dostęp do tej metody poprzez swój łańcuch prototypów.
Podsumowanie
__proto__
jest właściwością każdego obiektu i wskazuje na prototyp, z którego dany obiekt dziedziczy.prototype
jest właściwością funkcji konstruktora i definiuje prototyp dla wszystkich instancji stworzonych przez tę funkcję.- Kiedy tworzymy nowy obiekt za pomocą konstruktora i
new
, właściwośćprototype
tego konstruktora staje się__proto__
nowego obiektu.
Zrozumienie różnicy między __proto__
a prototype
jest kluczowe dla efektywnego wykorzystania mechanizmów dziedziczenia i prototypów w JavaScript, umożliwiając tworzenie bardziej złożonych i efektywnych struktur danych i aplikacji.
Jeżeli chcesz przyśpieszyć swoją naukę tworzenia stron chciałbym polecić mój kurs video JavaScript w którym nauczysz się tego języka od podstaw do zaawansowanych jego aspektów.