Sobes.tech
Middle

JavaScript-də prototip miras nədir?

sobes.tech Süni İntellekt

AI-dan cavab

JavaScript-də obyektlər öz prototiplərindən xüsusiyyətlər və metodlar miras alır. Hər bir obyektin prototipi başqa bir obyekt olub, onun xüsusiyyətləri və metodları prototip zənciri vasitəsilə əlçatan olur.

Obyektin xüsusiyyətinə daxil olarkən, JavaScript əvvəlcə onu birbaşa obyektin özündə axtarır. Əgər xüsusiyyət tapılmazsa, axtarış həmin obyektin prototipində, sonra prototipin prototipində və s. davam edir, xüsusiyyət tapılana və ya zəncirin sonuna (null) çatana qədər.

Prototip mirasçılığı klassik mirasdan fərqlənir (Java və ya C++ kimi), burada obyektlər onların strukturu və davranışını təsvir edən klasslardan yaradılır. JavaScript-də, ES6 ilə təqdim olunan klasslar, prototip əsaslı miras üzərində sintaktik şəkərdir.

Əsas aspektlər:

  • __proto__: Obyektin daxili xüsusiyyəti olub, onun prototipinə istinad edir.
  • prototype: Konstruktorun (konstruktor kimi istifadə olunan funksiya) xüsusiyyəti olub, yaradılan nümunələr üçün prototip kimi xidmət edən obyektə istinad edir.
  • Object.getPrototypeOf(obj): Bir obyektin prototipini almaq üçün standart metod.
  • Object.setPrototypeOf(obj, proto): Bir obyektin prototipini təyin etmək üçün standart metod.

Nümunə:

// Konstruktor funksiyası
function Animal(name) {
  this.name = name;
}

// Animal prototipinə metod əlavə et
Animal.prototype.sayHello = function() {
  console.log(`Salam, mənim adım ${this.name}`);
};

// Nümunə yaradın
const dog = new Animal("Buddy");

// Prototip metodunu çağırın
dog.sayHello(); // Çıxış: Salam, mənim adım Buddy

// dog-un prototipi Animal.prototype-dir
console.log(Object.getPrototypeOf(dog) === Animal.prototype); // true

// Animal.prototype-un prototipi Object.prototype-dir
console.log(Object.getPrototypeOf(Animal.prototype) === Object.prototype); // true

// Prototip zəncirinin sonu null-dir
console.log(Object.getPrototypeOf(Object.prototype) === null); // true

Klassik mirasla müqayisədə (ES6 klasslarından istifadə etməklə):

class Animal {
  constructor(name) {
    this.name = name;
  }

  sayHello() {
    console.log(`Salam, mənim adım ${this.name}`);
  }
}

class Dog extends Animal {
  constructor(name, breed) {
    super(name); // Ata klassın konstruktorunu çağırır
    this.breed = breed;
  }

  bark() {
    console.log("Hav hav!");
  }
}

const buddy = new Dog("Buddy", "Golden Retriever");
buddy.sayHello(); // Çıxış: Salam, mənim adım Buddy (Animal-dan miras)
buddy.bark(); // Çıxış: Hav hav! (Dog-un metodu)

// ES6 klassları, prototiplər üzərində sintaktik şəkərdir
console.log(Object.getPrototypeOf(Dog) === Animal); // true (klasslar arasında miras)
console.log(Object.getPrototypeOf(Dog.prototype) === Animal.prototype); // true (metodların prototiplər vasitəsilə mirası)
console.log(Object.getPrototypeOf(buddy) === Dog.prototype); // true (nümunə klassin prototipindən miras alır)

Prototip əsaslı miras, JavaScript-də əsas konseptdir və onun anlaşılması dil ilə effektiv işləmək üçün vacibdir.