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
userdaconstructorni qidiradi. Hech narsa yo’q. - Keyin u prototip zanjiriga amal qiladi.
userprototipiUser.prototypedir va unda ham hech narsa yo’q. User.prototypening qiymati{}oddiy obyekt bo’lib, uning prototipiObject.prototypedir. VaObject.prototype.constructor == Objectmavjud. 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.