Nima uchun ikkita hamster to'la?
Bizda ikkita hamster bor: speedy va lazy umumiy hamster obyektidan merosxo’r.
Ulardan birini boqsak, ikkinchisi ham to’yadi. Nima uchun? Buni qanday tuzatish kerak?
let hamster = {
stomach: [],
eat(food) {
this.stomach.push(food);
},
};
let speedy = {
__proto__: hamster,
};
let lazy = {
__proto__: hamster,
};
// Bu ovqat topdi
speedy.eat("olma");
alert(speedy.stomach); // olma
// Unda ham bor, nega? iltimos tuzating
alert(lazy.stomach); // olma
Keling, speedy.eat("olma") chaqiurvida nimalar bo’layotganini diqqat bilan ko’rib chiqamiz.
-
speedy.eatusuli prototipda topilgan (=hamster), so’ngrathis=speedy(nuqta oldidagi obyekt) bilan bajariladi. -
Keyin
this.stomach.push()stomachxususiyatini topishi va ungapushni chaqirishi kerak.thisda (=speedy)stomachni qidiradi, ammo hech narsa topilmadi. -
Keyin u prototip zanjiriga ergashib,
hamsterdastomachni topadi. -
Keyin u prototipning oshqozoniga ovqatni qo’shib, ustiga
pushni chaqiradi.
Shunday qilib, barcha hamsterlar bitta oshqozonni bo’lishadi!
Har safar stomach prototipdan olinadigan bo’lsa, u holda stomach.push uni “joyida” o’zgartiradi.
Iltimos e’tibor bering, this.stomach = oddiy tayinlashda bunday narsa bo’lmaydi.
let hamster = {
stomach: [],
eat(food) {
// this.stomach.push o'rniga this.stomach o'rnating
this.stomach = [food];
}
};
let speedy = {
__proto__: hamster
};
let lazy = {
__proto__: hamster
};
// Speedy bittasi ovqat topdi
speedy.eat("olma");
alert( speedy.stomach ); // olma
// Lazy birining qorni bo'sh
alert( lazy.stomach ); // <nothing>
Endi barchasi yaxshi ishlaydi, chunki this.stomach= stomach izlamaydi. Qiymat to’g’ridan-to’g’ri this obyektiga yoziladi.
Shuningdek, har bir hamsterning o’z oshqozoniga ega ekanligiga ishonch hosil qilish orqali biz muammodan butunlay qochishimiz mumkin:
let hamster = {
stomach: [],
eat(food) {
this.stomach.push(food);
}
};
let speedy = {
__proto__: hamster,
stomach: []
};
let lazy = {
__proto__: hamster,
stomach: []
};
// Speedy bittasi ovqat topdi
speedy.eat("olma");
alert( speedy.stomach ); // olma
// Lazy birining qorni bo'sh
alert( lazy.stomach ); // <nothing>
Umumiy yechim sifatida, ma’lum bir obyektning holatini tavsiflovchi barcha xususiyatlar, masalan, yuqoridagi stomach odatda ushbu obyektga yoziladi. Bu bunday muammolarning oldini oladi.