Har bir bolaning otasi va onasi bo'lganidek (hech bo'lmaganda biologik ma'noda), JavaScript-dagi har qanday ob'ekt ham shunday. Va agar ota, biz qaror qilganimizdek, dizayner sifatida ishlasa, demak, ona shunchaki prototipdir. Keling, bu qanday sodir bo'lishini ko'rib chiqaylik:
make_me \u003d funktsiya (_name) {
ogohlantirish ("Men ishga tushirdim");
bu .name \u003d _name;
bu .show_name \u003d function () (ogohlantirish (bu .name);)
}
/*
Funksiya kalit so'zini ko'rib, tarjimon uning o'ng tomonidagi kodni va shu vaqtdan boshlab tekshiradi hammasi yaxshi - xotirada yangi ob'ekt yaratadi, bu ham bizning vazifamiz. Keyin, avtomatik ravishda (dasturchining ishtirokisiz) bu funktsiya uchun bo'sh ob'ektga ishora qiluvchi prototip xususiyati yaratiladi. Agar biz buni qo'lda qilsak, u make_me.prototype \u003d new Object ();
Keyinchalik, berilgan ob'ekt (prototip xususiyati tomonidan ko'rsatilgan), shuningdek, funktsiyaga yo'naltirilgan konstruktor xususiyati bilan avtomatik ravishda qo'shiladi. Bunday tsikl aloqasi chiqadi.
Endi (konstruktor: ... funktsiyaga havola ...) deb ta'riflash mumkin bo'lgan ushbu ob'ekt - bu prototip funktsiya.
*/
// Ob'ekt haqiqatan ham ob'ektdir
ogohlantirish (make_me.prototype.constructor typeof); // Funksiya - bu bizning vazifamiz
ogohlantirish (make_me.prototype.constructor \u003d\u003d\u003d make_me); // rost
// make_me funktsiyasi prototipiga yangi usul qo'shing
Bola \u003d yangi make_me ("Vasya"); // ular meni ishga tushirishdi
/ * Endi, oldingi misolda tasvirlangan hamma narsadan tashqari, bola ob'ektida make_me.prototype bilan bir xil ob'ektni ko'rsatadigan qo'shimcha yashirin xususiyat [] yaratiladi. Chunki mulk yashiringan, biz uning qiymatini ko'ra olmaymiz yoki o'zgartira olmaymiz - ammo keyingi ishlarda bu muhim rol o'ynaydi * /
Ogohlantirish (child.name); // Vasya
child.show_name (); // Vasya
Child.set_name ("Kolya");
/ * Birinchidan, tarjimon bola ob'ektida set_name usulini izlaydi. U yo'qligi sababli, u bolani qidirishni davom ettiradi. [] Mulk, uni topadi va boshlaydi. * /
child.show_name (); // Kolya - endi Vasiyaning ismi Kolya :)
Make_me.prototype.show_name2 \u003d function () (ogohlantirish ("Salom", + bu .name;) //T.k. prototip - oddiy ob'ekt, biz uni tezda ham o'zgartirishimiz mumkin
Child2 \u003d yangi make_me ("Petya");
child2.show_name2 (); // Salom, Petya
child.show_name2 (); // Salom Kolya - prototipdagi o'zgarishlar nafaqat yangi yaratilgan ob'ektlarga, balki barcha eski narsalarga ham ta'sir qiladi
Child2.show_name2 \u003d function () (ogohlantirish ( "Men ismimni aytmayman");} // Ob'ektni hali ham o'zgartirishimiz mumkin, shu bilan birga ushbu ob'ektdagi yangi show_name2 usuli (va faqat unda), xuddi prototipdan eski usulni "yozib qo'yadi"
child2.show_name2 (); // Men ismimni aytmayman - chunki endi bizda show_name2 o'z uslubimiz bor, keyin u chaqiriladi va prototipda hech qanday qidiruv bo'lmaydi
Child.show_name2 (); // Salom, Kolya - hammasi shu erda
Make_me.prototype \u003d (prop: "salom") // Keling, yana prototipni yaratishga harakat qilaylik
Ogohlantirish (child.prop); // aniqlanmagan
child.show_name2 (); // Salom Kolya
/ * Agar siz ma'lumotnomada ishlash nima ekanligini eslasangiz, unda hamma narsa aniq. Prototipni qayta yaratish havolani uzadi va endi bola va child2 ob'ektlarining [] xususiyati bitta ob'ektga ishora qiladi (u avval make_me funktsiyasining prototipi bo'lgan) va make_me.prototype xususiyati boshqa ob'ektga, ya'ni make_me funktsiyasining yangi prototipi * /
Child3 \u003d yangi make_me ("Oleg");
ogohlantirish (child3.prop); // salom - kutilganidek
* Ushbu manba kodi ta'kidlash manbai bilan ta'kidlangan.
Misoldan ko'rinib turibdiki, otasi onasiga sodiq qolganda (ya'ni funktsiya prototipi bir xil bo'lib qolsa), barcha bolalar onaga bog'liq va undagi barcha o'zgarishlarga sezgir. Biroq, ota-onalar ajrashishi bilanoq (dizayner prototipni boshqasiga o'zgartiradi), bolalar darhol kimni qaerga tarqatishadi va ular bilan endi aloqasi yo'q.
Do'stlaringiz bilan baham: |