Xuddi shu konstruktor bilan obyekt yarating
Tasavvur qiling, bizda konstruktor funktsiyasi tomonidan yaratilgan obj
tasodif obyekti bor – qaysi biriligini bilmaymiz, lekin undan foydalanib yangi obyekt yaratmoqchimiz.
Biz buni shunday qila olamizmi?
let obj2 = new obj.constructor();
Bunday kodni to’g’ri ishlashiga imkon beradigan obj
uchun konstruktor funktsiyasiga misol keltiring. Va uni noto’g’ri ishlashga olib keladigan misol.
Agar "constructor"
xususiyati to’g’ri qiymatga ega ekanligiga amin bo’lsak, bunday yondashuvdan foydalanishimiz mumkin.
Masalan, standart "prototype"
ga tegmasak, u holda ushbu kod aniq ishlaydi:
function User(name) {
this.name = name;
}
let user = new User("John");
let user2 = new user.constructor("Pete");
alert(user2.name); // Pete (ishladi!)
Bu ishladi, chunki User.prototype.constructor == User
.
…Ammo agar kimdir, masalan, User.prototype
ning ustiga yozsa va "constructor"
ni qayta yaratishni unutsa, u holda bu muvaffaqiyatsiz bo’ladi.
Masalan:
function User(name) {
this.name = name;
}
User.prototype = {}; // (*)
let user = new User('John');
let user2 = new user.constructor('Pete');
alert( user2.name ); // undefined
Nega user2.name
undefined
?
new user.constructor("Pete")
qanday ishlashi:
- Birinchidan, u
user
daconstructor
ni qidiradi. Hech narsa yo’q. - Keyin u prototip zanjiriga amal qiladi.
user
prototipiUser.prototype
dir va unda ham hech narsa yo’q. User.prototype
ning qiymati{}
oddiy obyekt bo’lib, uning prototipiObject.prototype
dir. VaObject.prototype.constructor == Object
mavjud. Shunday qilib u ishlatiladi.
Oxir-oqibat, bizda let user2 = new Object('Pete')
bor. O’rnatilgan Object
konstruktori argumentlarni e’tiborsiz qoldiradi, u har doim bo’sh obyektni yaratadi – bu bizda user2
da mavjud.