W tym samouczku nauczysz się prototypów w JavaScript na podstawie przykładów.
Zanim nauczysz się prototypów, zapoznaj się z tymi samouczkami:
- Obiekty JavaScript
- Funkcja konstruktora JavaScript
Jak wiesz, możesz stworzyć obiekt w JavaScript używając funkcji konstruktora obiektów. Na przykład,
// constructor function function Person () ( this.name = 'John', this.age = 23 ) // creating objects const person1 = new Person(); const person2 = new Person();
W powyższym przykładzie function Person()
jest funkcją konstruktora obiektów. Stworzyliśmy dwa obiekty person1
iz person2
niego.
Prototyp JavaScript
W JavaScript każda funkcja i obiekt ma domyślnie właściwość o nazwie prototype. Na przykład,
function Person () ( this.name = 'John', this.age = 23 ) const person = new Person(); // checking the prototype value console.log(Person.prototype); // (… )
W powyższym przykładzie próbujemy uzyskać dostęp do właściwości prototypu Person
funkcji konstruktora.
Ponieważ własność prototypu nie ma w tej chwili wartości, pokazuje pusty obiekt (…).
Dziedziczenie prototypów
W JavaScript można użyć prototypu, aby dodać właściwości i metody do funkcji konstruktora. A obiekty dziedziczą właściwości i metody z prototypu. Na przykład,
// constructor function function Person () ( this.name = 'John', this.age = 23 ) // creating objects const person1 = new Person(); const person2 = new Person(); // adding property to constructor function Person.prototype.gender = 'male'; // prototype value of Person console.log(Person.prototype); // inheriting the property from prototype console.log(person1.gender); console.log(person2.gender);
Wynik
(płeć: „mężczyzna”) mężczyzna mężczyzna
W powyższym programie dodaliśmy nową właściwość gender
do Person
funkcji konstruktora za pomocą:
Person.prototype.gender = 'male';
Następnie obiekt person1
i person2
dziedziczy właściwość gender
z właściwości prototypu Person
funkcji konstruktora.
W związku z tym zarówno obiekty, jak person1
i person2
mają dostęp do właściwości gender.
Uwaga: Składnia dodawania właściwości do funkcji konstruktora obiektów jest następująca:
objectConstructorName.prototype.key = 'value';
Prototyp jest używany w celu zapewnienia dodatkowej własności wszystkim obiektom utworzonym z funkcji konstruktora.
Dodaj metody do funkcji konstruktora przy użyciu prototypu
Możesz także dodać nowe metody do funkcji konstruktora za pomocą prototypu. Na przykład,
// constructor function function Person () ( this.name = 'John', this.age = 23 ) // creating objects const person1 = new Person(); const person2 = new Person(); // adding a method to the constructor function Person.prototype.greet = function() ( console.log('hello' + ' ' + this.name); ) person1.greet(); // hello John person2.greet(); // hello John
W powyższym programie nowa metoda greet
jest dodawana do Person
funkcji konstruktora przy użyciu prototypu.
Zmiana prototypu
Jeśli wartość prototypu zostanie zmieniona, wszystkie nowe obiekty będą miały zmienioną wartość właściwości. Wszystkie wcześniej utworzone obiekty będą miały poprzednią wartość. Na przykład,
// constructor function function Person() ( this.name = 'John' ) // add a property Person.prototype.age = 20; // creating an object const person1 = new Person(); console.log(person1.age); // 20 // changing the property value of prototype Person.prototype = ( age: 50 ) // creating new object const person3 = new Person(); console.log(person3.age); // 50 console.log(person1.age); // 20
Uwaga : Nie należy modyfikować prototypów standardowych, wbudowanych obiektów JavaScript, takich jak łańcuchy, tablice itp. Jest to uważane za złą praktykę.
Tworzenie łańcuchów prototypów JavaScript
Jeśli obiekt próbuje uzyskać dostęp do tej samej właściwości, która znajduje się w funkcji konstruktora i obiekcie prototypu, obiekt pobiera właściwość z funkcji konstruktora. Na przykład,
function Person() ( this.name = 'John' ) // adding property Person.prototype.name = 'Peter'; Person.prototype.age = 23 const person1 = new Person(); console.log(person1.name); // John console.log(person1.age); // 23
W powyższym programie nazwa właściwości jest zadeklarowana w funkcji konstruktora, a także we właściwości prototyp funkcji konstruktora.
Gdy program jest wykonywany, person1.name
sprawdza funkcję konstruktora, aby sprawdzić, czy istnieje właściwość o nazwie name
. Ponieważ funkcja konstruktora ma właściwość name z wartością 'John'
, obiekt przyjmuje wartość z tej właściwości.
Gdy program jest wykonywany, person1.age
sprawdza funkcję konstruktora, aby sprawdzić, czy istnieje właściwość o nazwie age
. Ponieważ funkcja konstruktora nie ma age
właściwości, program zagląda do obiektu prototypu funkcji konstruktora, a obiekt dziedziczy właściwość z obiektu prototypowego (jeśli jest dostępna).
Uwaga : Dostęp do właściwości prototypu funkcji konstruktora można również uzyskać z obiektu.
function Person () ( this.name = 'John' ) // adding a prototype Person.prototype.age = 24; // creating object const person = new Person(); // accessing prototype property console.log(person.__proto__); // ( age: 24 )
W powyższym przykładzie person
obiekt jest używany do uzyskania dostępu do właściwości prototypu za pomocą __proto__
. Jednak __proto__
został wycofany i należy go unikać.