Konstruktor funksiyalari va "new" operatori

Oddiy `{...}` sintaksisi yordamida bitta ob'ekt yaratish mumkin. Ammo ko'pincha ko'p o'xshash ob'ektlarni yaratish kerak bo'ladi, masalan, bir nechta foydalanuvchilar yoki menyu elementlari va hokazo.

Konstruktor funksiyalari va "new" operatori

Oddiy {...} sintaksisi yordamida bitta ob'ekt yaratish mumkin. Ammo ko'pincha ko'p o'xshash ob'ektlarni yaratish kerak bo'ladi, masalan, bir nechta foydalanuvchilar yoki menyu elementlari va hokazo.

Buni konstruktor funksiyalari va "new" operatoridan foydalanib amalga oshirish mumkin.

Konstruktor funksiyasi

Konstruktor funksiyalari texnik jihatdan oddiy funksiyalardir. Biroq, ularga nisbatan ikkita kelishilgan konvensiya mavjud:

  1. Ularning nomi bosh harf bilan boshlanadi.
  2. Ular faqat "new" operatori bilan bajarilishi kerak.

Masalan:

function User(name) {
  this.name = name;
  this.isAdmin = false;
}
 
let user = new User('Jack');
 
alert(user.name); // Jack
alert(user.isAdmin); // false

Funksiya "new" operatori bilan ishlaganda, quyidagi qadamlarni bajaradi:

  1. Yangi bo'sh ob'ekt yaratiladi va this ga tayinlanadi.
  2. Funksiya tanasi bajariladi. Odatda, bu this ga yangi xususiyatlar qo'shadi.
  3. this ning qiymati qaytariladi.

Boshqacha qilib aytganda, new User(...) quyidagi kabi ish qiladi:

function User(name) {
  // this = {};  (yashirincha)
 
  // this ga xususiyatlarni qo'shish
  this.name = name;
  this.isAdmin = false;
 
  // this ni qaytarish;  (yashirincha)
}

Shunday qilib, let user = new User("Jack") quyidagiga teng natija beradi:

let user = {
  name: 'Jack',
  isAdmin: false,
};

Agar boshqa foydalanuvchilarni yaratmoqchi bo'lsak, new User("Ann"), new User("Alice") kabi chaqirishimiz mumkin. Bu har safar literal ishlatishdan ancha qisqaroq va o'qish osonroq.

Konstruktorlarning asosiy maqsadi - qayta foydalanish mumkin bo'lgan ob'ekt yaratish kodini amalga oshirishdir.

Yana bir bor ta'kidlash joiz - texnik jihatdan har qanday funksiya (arrow funksiyalardan tashqari, chunki ular this ga ega emas) konstruktor sifatida ishlatilishi mumkin. U "new" bilan ishlatilishi mumkin va yuqoridagi algoritmni bajaradi. "Bosh harf bilan boshlash" - bu funksiya "new" bilan bajarilishi kerakligini aniq qilish uchun umumiy kelishuvdir.

new function() { … }

Agar bitta murakkab ob'ektni yaratishga oid ko'p qatorli kodimiz bo'lsa, uni darhol chaqiriladigan konstruktor funksiyasiga o'rashimiz mumkin:

// funksiya yarating va darhol uni new bilan chaqiring
let user = new (function () {
  this.name = 'John';
  this.isAdmin = false;
 
  // ...foydalanuvchi yaratish uchun boshqa kodlar
  // ehtimol murakkab mantiq va ifodalar
  // mahalliy o'zgaruvchilar va boshqalar
})();

Bu konstruktorni yana bir bor chaqirib bo'lmaydi, chunki u hech qaerda saqlanmaydi, faqat yaratiladi va chaqiriladi. Shunday qilib, bu usul bitta ob'ektni yaratadigan kodni kapsulyatsiya qilishga qaratilgan, keyinchalik qayta ishlatishsiz.

Konstruktor rejimi testi: new.target

Kengaytirilgan mavzu

Bu bo'limdagi sintaksis kamdan-kam qo'llaniladi, agar hammasini bilishni xohlamasangiz, uni o'tkazib yuboring.

Funksiya ichida, u "new" bilan chaqirilganmi yoki yo'qligini maxsus new.target xususiyati yordamida tekshirishimiz mumkin.

Oddiy chaqiruvlar uchun bu aniqlanmagan (undefined) va agar "new" bilan chaqirilgan bo'lsa, funksiya bilan teng bo'ladi:

function User() {
  alert(new.target);
}
 
// "new" siz:
User(); // aniqlanmagan
 
// "new" bilan:
new User(); // function User { ... }

Bu funksiya "new" bilan, "konstruktor rejimida" yoki "oddiy rejimda" chaqirilganmi, buni bilish uchun ishlatilishi mumkin.

Shuningdek, biz "new" va oddiy chaqiruvlar uchun bir xil natija olishimiz mumkin, masalan:

function User(name) {
  if (!new.target) {
    // agar meni newsiz ishlatsangiz
    return new User(name); // ...siz uchun new ni qo'shaman
  }
 
  this.name = name;
}
 
let john = User('John'); // chaqiruvni new User ga yo'naltiradi
alert(john.name); // John

Bu usul ba'zan kutubxonalarda sintaksisni moslashuvchan qilish uchun ishlatiladi. Shunday qilib, odamlar funksiyani "new" bilan yoki "new" siz chaqirishlari mumkin, va u hali ham ishlaydi.

Biroq, bu har joyda ishlatish yaxshi emas, chunki "new" ni qoldirish natijasida nima sodir bo'layotgani kamroq aniq bo'ladi. "New" bilan esa biz hamma narsani bilamiz - yangi ob'ekt yaratilmoqda.

Konstruktorlardan qaytish

Odatda, konstruktorlar return operatoriga ega emas. Ularning vazifasi - zarur bo'lgan barcha narsalarni this ga yozish, va bu avtomatik ravishda natija bo'ladi.

Ammo agar return operatori mavjud bo'lsa, unda qoida oddiy:

  • Agar return ob'ekt bilan chaqirilsa, unda ob'ekt this o'rniga qaytariladi.
  • Agar return primitiv bilan chaqirilsa, u e'tiborga olinmaydi.

Boshqacha qilib aytganda, return ob'ekt bilan ishlatilganda, o'sha ob'ekt qaytariladi, boshqa barcha holatlarda this qaytariladi.

Masalan, bu yerda return this ni qaytarish o'rniga ob'ektni qaytaradi:

function BigUser() {
  this.name = 'John';
 
  return { name: 'Godzilla' }; // <-- ushbu ob'ektni qaytaradi
}
 
alert(new BigUser().name); // Godzilla, o'sha ob'ektni oldi

Va bu yerda bo'sh return bilan misol keltirilgan (yoki biz uning o'rniga primitivni joylashtirishimiz mumkin, farqi yo'q):

function SmallUser() {
  this.name = 'John';
 
  return; // <-- this ni qaytaradi
}
 
alert(new SmallUser().name); // John

Odatda, konstruktorlar return operatoriga ega emas. Bu yerda ob'ektlarni qaytarish bilan bog'liq maxsus xatti-harakatlarni to'liq yoritish uchun keltirilgan.

Qavslarni tashlab ketish

Aytgancha, biz "new" dan so'ng qavslarni tashlab ketishimiz mumkin:

let user = new User(); // <-- qavslar yo'q
// xuddi shu narsa
let user = new User();

Bu yerda qavslarni tashlab ketish "yaxshi uslub" deb hisoblanmaydi, lekin sintaksis spetsifikatsiya tomonidan ruxsat etilgan.

Konstruktor ichidagi metodlar

Konstruktor funksiyalaridan foydalanib ob'ektlar yaratish juda katta moslashuvchanlikni ta'minlaydi. Konstruktor funksiyasi parametrlarni olishi mumkin, ular ob'ektni qanday yaratishni va unga nima qo'shishni belgilaydi.

Albatta, this ga faqat xususiyatlar emas, balki metodlarni ham qo'shishimiz mumkin.

Masalan, quyidagi new User(name) ob'ektni berilgan nom bilan va sayHi metodini yaratadi:

function User(name) {
  this.name = name;
 
  this.sayHi = function () {
    alert('Mening ismim: ' + this.name);
  };
}
 
let john = new User('John');
 
john.sayHi(); // Mening ismim: John
 
/*
john = {
   name: "John",
   sayHi: function() { ... }
}
*/

Murakkab ob'ektlar yaratish uchun, yanada rivojlangan sintaksis - klass lar mavjud, ularni keyinroq ko'rib chiqamiz.

Xulosa

  • Konstruktor funksiyalari yoki qisqacha aytganda, konstruktorlar oddiy funksiyalardir, ammo ular

bosh harf bilan nomlanadi.

  • Konstruktor funksiyalari faqat "new" yordamida chaqirilishi kerak. Bunday chaqiruv boshida bo'sh this yaratilishini va oxirida to'ldirilgan this ning qaytarilishini bildiradi.
  • Konstruktor funksiyalarini bir nechta o'xshash ob'ektlarni yaratish uchun ishlatishimiz mumkin.

JavaScript ko'plab ichki til ob'ektlari uchun konstruktor funksiyalarini taqdim etadi: masalan, sanalar uchun Date, to'plamlar uchun Set va boshqalar.

Ob'ektlar, biz qaytib kelamiz!

Bu bobda biz ob'ektlar va konstruktorlar haqida faqat asosiy ma'lumotlarni qamrab oldik. Ular keyingi bo'limlarda ma'lumot turlari va funksiyalarni o'rganish uchun muhimdir.

Bularni o'rganganimizdan so'ng, biz ob'ektlarga qaytamiz va ularni chuqurroq o'rganamiz, xususan Prototiplar, Meros va Klasslar bo'limlarida.

Ushbu sahifada

GitHubda tahrirlash