JavaScript Class
Tags: javascript, class, web
Published: 2022-04-24 04:07:01

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hay9iquspv2yt6at7ccc.png)

Assalomu alaykum, bugungi maqolamiz JavaScript Class lari haqida bo'ladi.

JavaScriptda class ob'yekt yaratish uchun mo'ljallangan. Bunda class ob'yekt malumotlari va funksiyalarini o'z ichiga oladi. Boshqa dasturlash tillaridan farqli ravishda JavaScriptda class prototipli vorislikka asoslangan maxsus funksiya hisoblanadi.

## ES6 dan oldin

ES6 dan oldin JS da class tushunchasi bo'lmagan.Biz bilgan class ni yaratish uchun constructor va prototype dan foydalanilgan.

```js
function Person(name) {
    this.name = name;
}

Person.prototype.getName = function () {
    return this.name;
};

var ali = new Person("Ali Valiyev");
console.log(ali.getName());
```
Natija:
```
Ali Valiyev
```
Endi yuqoridagi kodning qanday ishlashini tushuntiraman.

Dastlab, `name` xususiyatiga ega `Person` konstruktor funksiyasi yaratildi. `prototype` ga getName() funksiyasi biriktirildi, endi bu funksiyani `Person` class ishlatilgan barcha holatlarda ishlatishimiz mumkin.

Keyin esa `new` operatori yordamida `Person` klassidan namuna oldik. `ali` ob'yekti prototipli vorislik orqali `Person` va `Object` klasslaridan namuna olganligi uchun endi ularning barcha xususiyatlaridan foydalana oladi. 
```js
console.log(john instanceof Person); // true
console.log(john instanceof Object); // true
``` 

## Es6 da class ning e'lon qilinishi

ES6 da class larni e'lon qilish uchun yangi sintaksis yaratildi. Yuqoridagi funksiya konstruktori yordamida yaratilgan class yangi sintaksisda quyidagicha yoziladi.
```js
class Person {
    constructor(name) {
        this.name = name;
    }
    getName() {
        return this.name;
    }
}
```
`Person` klassidagi `construtor()` ichida olinadigan namunaning xususiyatlari e'lon qilinadi va `new` operatori orqali klassdan namuna olinganda JavaScript avtomatik ravishda `constructor()` ni chaqiradi.

```js
let ali = new Person("Ali Valiyev");
```

`Person` klassidagi `getName()` <u>metod</u> deb ataladi va bunday qo'llaniladi.

```js
obyektNomi.metodNomi()
```

Misol uchun

```js
let name = ali.getName();
console.log(name); // "Ali Valiyev"
```

Biz yuqorida `class` ni maxsus funksiya dedik, buning isbotini ko'rish uchun `Person` klassining tipini `typeof` operatori orqali tekshiramiz.

```js
console.log(typeof Person); // function
```

## Class va funksiya konstruktori

Class va funksiya konstruktori orasida o'xshashlik bo'lishiga qaramasdan, ularda farqlanadigan muhim jihatlar bor.

Birinchi, class e'lon qilinganda funksiyaga o'xshab `hoisting` ga uchramaydi.

Misol uchun, quyidagi kodni `Person` klassi e'lon qilinishidan oldin yozsak, natija sifatida `ReferenceError` ega bo'lamiz.

```js
let ali = new Person("Ali Valiyev");
```

Xatolik

```js
Uncaught ReferenceError: Person is not defined
```

Ikkinchi, class ichidagi barcha kodlar avtomatik ravishda `strict mode` da ishlaydi.

Uchinchi, class metodlari `non enumerable`, ya'ni sanalmaydi(ular bilan `for ... in` va `Object.keys()` ni ishlata olmaymiz). Funksiya konstruktorida esa ob'yekt xususiyatlarini `non enumerable` qilish uchun `Object.defineProperty()` metodidan foydalanishimizga to'g'ri keladi.

Va oxirigisi, class konstruktorini `new` operatorisiz ishlatsak, xatolik beradi.

```js
let ali = Person("Ali Valiyev");
```

Xatolik

```js
Uncaught TypeError: Class constructor Person cannot be invoked without 'new'
```

### Xulosa

- class yaratish uchun `class` kalit so'zini ishlatamiz.
- class prototipli vorislikka asoslangan va kuchaytirilgan maxsus funksiya.

Foydali bo'lgan bo'lsa ulashing )