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
prototypexususiyati bor — buneworqali yaratilgan instanslarning[[Prototype]]iga aylanadigan obyekt (__proto__sifatida yokiObject.getPrototypeOforqali mavjud). - Xususiyat qidiruvi prototiplar zanjiri bo'yicha boradi: obyekt → uning prototipi → prototipning prototipi → ... →
null. - ES6'dagi
classsintaksisi — xuddi shu mexanizm ustidan sintaktik shakar:class Dog extends Animalqopqoq ostida prototiplar zanjirini xuddiDog.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?instanceofichki jihatdan qanday ishlaydi?- Nega metodlarni konstruktorda emas, prototipda aniqlash yaxshiroq?