Šta je prototipsko nasleđivanje u JavaScript-u?
sobes.tech АИ
Одговор од АИ
Objekti u JavaScriptu nasleđuju svojstva i metode od svojih prototipova. Prototip svakog objekta je drugi objekat, čija svojstva i metode su dostupne putem lanca prototipova.
Prilikom pristupa svojstvu objekta, JavaScript prvo traži direktno u samom objektu. Ako svojstvo nije pronađeno, pretraživanje se nastavlja u prototipu tog objekta, zatim u prototipu prototipa i tako dalje, dok se svojstvo ne pronađe ili ne dostigne kraj lanca (null).
Prototipno nasleđivanje se razlikuje od klasičnog nasleđivanja (kao u Javi ili C++), gde se objekti kreiraju iz klasa koje opisuju njihovu strukturu i ponašanje. U JavaScriptu, klase koje su se pojavile u ES6, su sintaktički šećer iznad prototipnog nasleđivanja.
Glavni aspekti:
- __proto__: Unutrašnje svojstvo objekta koje se odnosi na njegov prototip.
- prototype: Svojstvo konstruktora (funkcije koja se koristi kao konstruktor), koje se odnosi na objekat koji će služiti kao prototip za kreirane instance.
- Object.getPrototypeOf(obj): Standardan način za dobijanje prototipa objekta.
- Object.setPrototypeOf(obj, proto): Standardan način za postavljanje prototipa objekta.
Primer:
// Konstruktor funkcija
function Animal(name) {
this.name = name;
}
// Dodavanje metode u prototip Animal
Animal.prototype.sayHello = function() {
console.log(`Hello, my name is ${this.name}`);
};
// Kreiranje instance
const dog = new Animal("Buddy");
// Pozivanje metode iz prototipa
dog.sayHello(); // Izlaz: Hello, my name is Buddy
// Prototip psa je Animal.prototype
console.log(Object.getPrototypeOf(dog) === Animal.prototype); // Izlaz: true
// Prototip Animal.prototype je Object.prototype
console.log(Object.getPrototypeOf(Animal.prototype) === Object.prototype); // Izlaz: true
// Kraj lanca prototipova je null
console.log(Object.getPrototypeOf(Object.prototype) === null); // Izlaz: true
Upoređenje sa klasičnim nasleđivanjem (korišćenjem ES6 klasa):
class Animal {
constructor(name) {
this.name = name;
}
sayHello() {
console.log(`Hello, my name is ${this.name}`);
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name); // Pozivanje konstruktora roditeljske klase
this.breed = breed;
}
bark() {
console.log("Woof!");
}
}
const buddy = new Dog("Buddy", "Golden Retriever");
buddy.sayHello(); // Izlaz: Hello, my name is Buddy (nasleđuje od Animal)
buddy.bark(); // Izlaz: Woof! (metod Dog)
// Klase u ES6 su šećer iznad prototipa
console.log(Object.getPrototypeOf(Dog) === Animal); // Izlaz: true (nasleđivanje između klasa)
console.log(Object.getPrototypeOf(Dog.prototype) === Animal.prototype); // Izlaz: true (nasleđivanje metoda preko prototipa)
console.log(Object.getPrototypeOf(buddy) === Dog.prototype); // Izlaz: true (instanca nasleđuje od prototipa klase)
Prototipno nasleđivanje je ključna koncepcija u JavaScriptu, čije razumevanje je neophodno za efikasno rad sa jezikom.