Obyektga yoânaltirilgan dasturlashda klass â bu obyektlarni yaratish uchun kengaytiriladigan kod shabloni boâlib, ularda dastlabki qiymatlarni (xususiyatlar) va xatti-harakatlarni (metodlar) amalga oshirishni belgilaydi.
Amalda, biz koâpincha foydalanuvchilar yoki tovarlar yoki boshqa narsalar kabi bir xil turdagi koâplab obyektlarni yaratishimiz kerak.
Konstruktor, operator "new" bobidan allaqachon bilganimizdek, new function bunga yordam beradi.
Ammo zamonaviy JavaScript-da obyektga yoânaltirilgan dasturlash uchun foydali boâlgan juda yangi xususiyatlarni taqdim etadigan yanada rivojlangan âklassâ tuzilishi mavjud.
âKlassâ sintaksisi
Asosiy sintaksis:
class MyClass {
// klass metodlari
constructor() { ... }
method1() { ... }
method2() { ... }
method3() { ... }
...
}
Keyin new MyClass() roâyxatdagi barcha metodlar bilan yangi obyekt yaratadi.
constructor() metodi avtomatik ravishda new tomonidan chaqiriladi, shuning uchun biz u yerda obyektni ishga tushirishimiz mumkin.
Masalan:
class User {
constructor(name) {
this.name = name;
}
sayHi() {
alert(this.name);
}
}
// Foydalanish:
let user = new User("John");
user.sayHi();
new User("John") chaqirilganda:
- Yangi obyekt yaratiladi.
constructorberilgan argument bilan ishlaydi va ungathis.nameni tayinlaydi.
â¦Keyin biz user.sayHi() kabi metodlarni chaqira olamiz.
Yangi dasturchilar uchun odatiy tuzoq â bu sintaksis xatolariga olib keladigan klass metodlari orasida vergul qoâyishdir.
Bu yerdagi yozuvlarni obyektlar yozuvi bilan aralashtirish mumkin emas. Klass ichida vergul talab qilinmaydi.
Klass nima?
Xoâsh, aniq class nima? Bu oâylashi mumkin boâlgan til darajasidagi mutlaqo yangi obyekt emas.
Keling, barcha sehrni yoâqotaylik va aslida klass nima ekanligini koârib chiqaylik. Bu koâplab murakkab jihatlarni tushunishda yordam beradi.
JavaScript-da klass funktsiyaning bir turi.
Mana, qarang:
class User {
constructor(name) { this.name = name; }
sayHi() { alert(this.name); }
}
// isbot: User bu funktsiya
alert(typeof User); // function
class User {...} konstruktsiyasi aslida nima qiladi:
Usernomli funktsiyani yaratadi, bu klass deklaratsiyasining natijasi boâladi.- Funktsiya kodi
constructormetodidan olingan (agar biz bunday metodini yozmasak, boâsh deb hisoblanadi).
- Funktsiya kodi
sayHikabi barcha metodlarniUser.prototypeda saqlaydi.
Keyinchalik, yangi obyektlar uchun metodini chaqirganda, prototipdan olinadi, xuddi F.prototype bobida tasvirlanganidek. Shunday qilib, new User obyekti klass metodlariga kirish huquqiga ega.
Biz class User natijasini quyidagicha tasvirlashimiz mumkin:
Buni tekshirish uchun kod:
class User {
constructor(name) {
this.name = name;
}
sayHi() {
alert(this.name);
}
}
// klass bu funktsiya
alert(typeof User); // function
// ...yoki, aniqroq, konstruktor metodi
alert(User === User.prototype.constructor); // true
// metodlar User.prototype-da:
alert(User.prototype.sayHi); // alert(this.name);
// prototipda to'liq ikkita metod mavjud
alert(Object.getOwnPropertyNames(User.prototype)); // constructor, sayHi
Faqat sintaksis shakar emas
Baâzan odamlar class JavaScript-dagi âsintaksis shakarâ deb aytishadi, chunki biz aslida class kalit soâzisiz bir xil narsani eâlon qilishimiz mumkin edi:
// sof funktsiyalarda class User qayta yozish
// 1. Konstruktor funktsiyasini yarating
function User(name) {
this.name = name;
}
// har qanday funktsiya prototipi sukut bo'yicha konstruktor xususiyatiga ega,
// shuning uchun biz uni yaratishga hojat yo'q
// 2. Metodini prototipga qo'shing
User.prototype.sayHi = function () {
alert(this.name);
};
// Foydalanish:
let user = new User("John");
user.sayHi();
Ushbu taârifning natijasi taxminan bir xil. Shunday qilib, konstruktorni prototip metodlari bilan birgalikda aniqlash uchun class sintaksis shakar deb hisoblanishining haqiqatan ham sabablari bor.
Garchi, muhim farqlar mavjud.
-
Birinchidan,
classtomonidan yaratilgan funktsiya maxsus ichki xususiyat bilan belgilanadi[[FunctionKind]]:"classConstructor". Shunday qilib, uni qoâlda yaratish bilan bir xil emas.Oddiy funktsiyadan farqli oâlaroq, klass konstruktorini
newsiz chaqirish mumkin emas:class User { constructor() {} } alert(typeof User); // function User(); // Error: Class constructor User cannot be invoked without 'new'Shuningdek, aksariyat JavaScript interpretatorlarida klass konstruktorining matn vakilligi
class...bilan boshlanadi.class User { constructor() {} } alert(User); // class User { ... }Boshqa farqlar ham bor, ularni tez orada koâramiz.
-
Klass metodlarini sanab boâlmaydi Klass taârifi
"prototype"dagi barcha metodlar uchunenumerablebayroqnifalsega oârnatadi.Bu yaxshi, chunki agar biz obyekt uchun
for..inishlatsak, biz odatda uning klass metodlarini xohlamaymiz. -
Klasslar doimo
use strictdan foydalanadi Klass konstruktsiyasidagi barcha kodlar avtomatik ravishda qatâiy rejimda boâladi.
Bundan tashqari, class sintaksisining asosiy ishlashidan tashqari, biz keyinroq oârganadigan koâplab boshqa xususiyatlarni ham taklif etadi.
Klass ifodalari
Xuddi funktsiyalar singari, klasslarni boshqa ifoda ichida aniqlash, ularni oâtkazish, qaytarish, tayinlash va h.k. mumkin.
Mana, klass ifodasiga misol:
let User = class {
sayHi() {
alert("Salom");
}
};
Nomlangan funktsiya ifodalarga oâxshash, klass ifodasining nomi boâlishi yoki boâlmasligi mumkin.
Agar klass ifodasining nomi boâlsa, u faqat klass ichida koârinadi:
// "Named Class Expression" (alas, bunday atama yo'q, lekin bu nima bo'layotgani)
let User = class MyClass {
sayHi() {
alert(MyClass); // MyClass nomi faqat klass ichida ko'rinadi
}
};
new User().sayHi(); // ishlaydi, MyClass ta'rifini ko'rsatadi
alert(MyClass); // xato, MyClass nomi klassdan tashqarida ko'rinmaydi
Hatta klasslarni dinamik ravishda âtalabga binoanâ yaratishimiz mumkin, masalan:
function makeClass(phrase) {
// klassni e'lon qiling va uni qaytaring
return class {
sayHi() {
alert(phrase);
}
};
}
// Yangi klass yarating
let User = makeClass("Salom");
new User().sayHi(); // Salom
Getters/setters
Shuningdek, klasslar getter/setter, generator, hisoblash xususiyatlari va boshqalarni oâz ichiga oladi.
get/set yordamida amalga oshirilgan user.name uchun misol:
class User {
constructor(name) {
// setter ni chaqiradi
this.name = name;
}
get name() {
return this._name;
}
set name(value) {
if (value.length < 4) {
alert("Ism juda qisqa.");
return;
}
this._name = value;
}
}
let user = new User("John");
alert(user.name); // John
user = new User(""); // Ism juda qisqa.
Ichkarida, getter va setterlar User.prototype da yaratiladi.
Hisoblangan nomlar [â¦]
Hisoblangan metod nomi bilan misol, kvadrat qavslar ichida:
class User {
['say' + 'Hi']() {
alert("Salom");
}
}
new User().sayHi();
Bunday xususiyatlar eslab qolinishi oson va simvollar uchun foydali.
Klass xususiyatlari
Klass darajasidagi xususiyatlar tilga yaqinda qoâshilgan.
Yuqoridagi misolda User da faqat metodlar mavjud edi. Keling, xususiyat qoâshaylik:
class User {
name = "Anonim";
sayHi() {
alert(`Salom, ${this.name}!`);
}
}
new User().sayHi(); // Salom, Anonim!
Xususiyat User.prototype ga joylashtirilmagan. Buning oârniga, u har bir obyekt uchun alohida, new tomonidan yaratiladi. Shunday qilib, xususiyat hech qachon bir klassning turli obyektlari oârtasida taqsimlanmaydi.
Klass xususiyatlarining muhim farqi shundaki, ular User.prototype da emas, balki alohida obyektlarda oârnatiladi:
class User {
name = "John";
}
let user = new User();
alert(user.name); // John
alert(User.prototype.name); // undefined
Klass xususiyatlari bilan bogâlangan metodlar yaratish
Funktsiyani bog'lash bobida koârsatilganidek, JavaScript-dagi funktsiyalar dinamik this ga ega. Bu chaqiruv kontekstiga bogâliq.
Shunday qilib, agar obyekt metodi boshqa kontekstda uzatilsa va chaqirilsa, this endi oâsha obyektga havola boâlmaydi.
Masalan, bu kod undefined ni koârsatadi:
class Button {
constructor(value) {
this.value = value;
}
click() {
alert(this.value);
}
}
let button = new Button("salom");
setTimeout(button.click, 1000); // undefined
Muammo âthis ni yoâqotishâ deb ataladi.
Funktsiyani bog'lash bobida muhokama qilinganidek, buni tuzatishning ikkita yondashuvi bor:
setTimeout(() => button.click(), 1000)kabi oârash-funktsiyasini oâtkazish.- Metodini obyektga bogâlash, masalan konstruktorda.
Klass xususiyatlari yana bir, juda oqlangan sintaksisni taqdim etadi:
class Button {
constructor(value) {
this.value = value;
}
click = () => {
alert(this.value);
}
}
let button = new Button("salom");
setTimeout(button.click, 1000); // salom
click = () => {...} klass xususiyati har bir Button obyektida alohida funktsiya yaratadi, ichida this shu obyektga havola qiladi. Biz button.click ni hamma joyga oâtkazishimiz mumkin va this ning qiymati har doim toâgâri boâladi.
Bu ayniqsa brauzer muhitida, voqealar uchun tinglovchilar uchun foydali.
Xulosa
Asosiy klass sintaksisi quyidagicha:
class MyClass {
prop = value; // xususiyat
constructor(...) { // konstruktor
// ...
}
method(...) {} // metod
get something(...) {} // getter metod
set something(...) {} // setter metod
[Symbol.iterator]() {} // hisoblangan nom bilan metod (bu yerda simvol)
// ...
}
MyClass texnik jihatdan funktsiya (biz constructor sifatida taqdim etadigan), metodlar, getter va setterlar esa MyClass.prototype ga yoziladi.
Keyingi boblarda biz klasslar haqida, jumladan meros va boshqa xususiyatlar haqida koâproq bilib olamiz.
Izohlar
<code>yorlig'ini ishlating, bir nechta satrlar uchun - ularni<pre>yorlig'i bilan o'rab qo'ying, 10 satrdan ortiq bo'lsa - sandbox (plnkr, jsbin, codepenâ¦)