Sobes.tech
Middle

Š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.