JavaScript'da prototipli meros qanday ishlaydi?

SeniorJavaScript #javascript #prototypes #oop

Savol

JavaScript'da prototipli meros qanday tuzilgan?

Qisqa javob

Klassik OOP tillaridan farqli o'laroq, JavaScript prototiplardan foydalanadi: har bir obyekt boshqa obyektga ichki [[Prototype]] havolasiga ega bo'lib, agar xususiyat/metod obyektning o'zida bo'lmasa, undan qidiriladi.

Batafsil javob

  • Har bir funksiyaning prototype xususiyati bor — bu new orqali yaratilgan instanslarning [[Prototype]]iga aylanadigan obyekt (__proto__ sifatida yoki Object.getPrototypeOf orqali mavjud).
  • Xususiyat qidiruvi prototiplar zanjiri bo'yicha boradi: obyekt → uning prototipi → prototipning prototipi → ... → null.
  • ES6'dagi class sintaksisi — xuddi shu mexanizm ustidan sintaktik shakar: class Dog extends Animal qopqoq ostida prototiplar zanjirini xuddi Dog.prototype = Object.create(Animal.prototype) kabi sozlaydi.
  • Object.create(proto) konstruktorni chaqirmasdan aniq berilgan prototip bilan obyekt yaratadi — mexanizmni ishda ko'rishning eng "toza" usuli.

Amaliy xulosa: metodlarni konstruktorda emas, prototypeda aniqlash kerak — aks holda har bir instans bitta umumiy funksiya o'rniga uning o'z nusxasini oladi.

Misol

function Animal(name) {
  this.name = name
}
Animal.prototype.speak = function () {
  return `${this.name} ovoz chiqaradi`
}

function Dog(name) {
  Animal.call(this, name)
}
Dog.prototype = Object.create(Animal.prototype)
Dog.prototype.speak = function () {
  return `${this.name} hurdi`
}

const rex = new Dog('Reks')
console.log(rex.speak()) // "Reks hurdi"
console.log(rex instanceof Animal) // true — Dog.prototype Animal.prototype'dan meros oladi

// Xuddi shu narsa class orqali:
class AnimalEs6 {
  constructor(name) { this.name = name }
  speak() { return `${this.name} ovoz chiqaradi` }
}
class DogEs6 extends AnimalEs6 {
  speak() { return `${this.name} hurdi` }
}

Qo'shimcha savollar

  • __proto__ prototypedan nimasi bilan farq qiladi?
  • instanceof ichki jihatdan qanday ishlaydi?
  • Nega metodlarni konstruktorda emas, prototipda aniqlash yaxshiroq?