- Class Declaration
- Class Expression
- Constructor
- Instance Properties
- Instance Methods
- Static Properties
- Static Methods
- Getters va Setters
- Inheritance (extends)
- super()
- Prototype Inheritance
- Private Fields
- Private Methods
- Protected Fields
- Computed Method Names
- new.target
- Class Hoisting bo‘lmaydi
- Abstract Class (imitatsiya)
- Mixins
- instanceof
- this
- OOP tamoyillari
Class deklaratsiyasi — JavaScriptda yangi sinf yaratishning standart usuli. class kalit so‘zi bilan e’lon qilinadi va odatda nomlanadi. Shu sinfdan obyektlar yaratish mumkin.
class Person {
constructor(name, age) {
this.name = name
this.age = age
}
}
const user = new Person("Ali", 25)
console.log(user.name) // AliClass expression — sinfni qiymat sifatida o‘zgaruvchiga berish yoki boshqa joyga uzatish uchun ishlatiladi. U anonim yoki nomlangan bo‘lishi mumkin.
// Anonim class
const Car = class {
constructor(model) {
this.model = model
}
}
const myCar = new Car("Tesla")
console.log(myCar.model) // Teslaconstructor — classdan obyekt yaratilganda avtomatik ishga tushadigan maxsus metod. Unda obyektning boshlang‘ich qiymatlari belgilanadi.
class Book {
constructor(title, author) {
this.title = title
this.author = author
}
}
const b = new Book("JS Basics", "Jamacoder")
console.log(b.title) // JS BasicsInstance properties — bu obyektga tegishli maydonlar. Har bir obyekt o‘ziga xos qiymatga ega bo‘ladi.
class User {
constructor(name, age) {
this.name = name
this.age = age
}
}
const u1 = new User("Hasan", 20)
const u2 = new User("Husan", 22)
console.log(u1.name) // Hasan
console.log(u2.name) // HusanInstance metodlari — class ichida yozilgan funksiyalar bo‘lib, faqat obyekt orqali chaqiriladi. Ular obyektning ma’lumotlariga ishlov beradi.
class Calculator {
add(a, b) {
return a + b // Qo'shish
}
multiply(a, b) {
return a * b // Ko'paytirish
}
}
const calc = new Calculator()
console.log(calc.add(2, 3)) // 5
console.log(calc.multiply(4, 5)) // 20Static property — bu sinfga tegishli maydon, lekin obyektlarga tegishli emas. static kalit so‘zi bilan e’lon qilinadi.
class Helper {
static version = "1.0.0"
}
console.log(Helper.version) // 1.0.0Static metodlar class darajasida ishlaydi va obyektlar orqali chaqirilmaydi. Ular utility funksiyalar uchun qulay.
class MathUtils {
static square(x) {
return x * x
}
}
console.log(MathUtils.square(5)) // 25Getter va Setter obyektning propertylarini olish va o‘rnatish uchun ishlatiladi. Ular propertyni private yoki encapsulated qilishda foydali.
class Person {
constructor(name) {
this._name = name
}
get name() {
return this._name
}
set name(newName) {
this._name = newName
}
}
const p = new Person("Ali")
console.log(p.name) // Ali
p.name = "Hasan"
console.log(p.name) // HasanInheritance — bu bir classning boshqa classdan meros olish imkoniyati. Child class parent class metodlari va propertylarini ishlata oladi.
class Animal {
constructor(name) {
this.name = name
}
speak() {
console.log(`${this.name} makes a sound`)
}
}
class Dog extends Animal {
speak() {
console.log(`${this.name} barks`)
}
}
const d = new Dog("Buddy")
d.speak() // Buddy barkssuper() — child class constructorida parent class constructorini chaqirish uchun ishlatiladi. Shu orqali parent propertylarini o‘rnatish mumkin.
class Animal {
constructor(name) {
this.name = name
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name)
this.breed = breed
}
}
const d = new Dog("Buddy", "Labrador")
console.log(d.name) // Buddy
console.log(d.breed) // LabradorJavaScriptda classlar prototip orqali meros oladi. Har bir obyekt [[Prototype]] orqali parentning property va metodlariga kiradi.
function Animal(name) {
this.name = name
}
Animal.prototype.speak = function() {
console.log(`${this.name} makes a sound`)
}
const dog = new Animal("Rex")
dog.speak() // Rex makes a sound
12. Private Fields
# bilan e’lon qilingan maydonlar private hisoblanadi va class tashqarisidan ularga kira olmaysiz. Bu encapsulation uchun qulay.
class Person {
#ssn
constructor(name, ssn) {
this.name = name
this.#ssn = ssn
}
getSSN() {
return this.#ssn
}
}
const p = new Person("Ali", "123-45-6789")
console.log(p.getSSN()) // 123-45-6789Private metodlar ham # bilan e’lon qilinadi va faqat class ichida ishlaydi. Class tashqarisidan chaqirib bo‘lmaydi.
class Counter {
#count = 0
#increment() {
this.#count++
}
increase() {
this.#increment()
return this.#count
}
}
const c = new Counter()
console.log(c.increase()) // 1JavaScriptda haqiqiy protected yo‘q, lekin _ bilan belgilangan propertylar child classlar tomonidan ishlatilishi mumkin.
class Person {
_name
constructor(name) {
this._name = name
}
}
class Employee extends Person {
getName() {
return this._name
}
}
const e = new Employee("Ali")
console.log(e.getName()) // AliMetod nomlarini dynamic ravishda [expression] bilan hisoblash mumkin. Bu flexibility beradi.
const methodName = "sayHello"
class Greeter {
[methodName]() {
console.log("Hello!")
}
}
const g = new Greeter()
g.sayHello() // Hello!new.target yordamida class yoki function qaysi kontekstda chaqirilganini bilish mumkin. Shu orqali abstract class imitatsiya qilish mumkin.
class Person {
constructor() {
if (!new.target) {
throw new Error("Must use new")
}
console.log("Created!")
}
}
const p = new Person() // Created!Class declaration hoisting qilinmaydi. Shu sababdan classdan oldin unga murojaat qilish mumkin emas.
// console.log(Person) // Error
class Person {}
18. Abstract Class (imitatsiya)
JSda abstract class yo‘q, lekin new.target bilan uni imitasiya qilish mumkin.
class AbstractAnimal {
constructor() {
if (new.target === AbstractAnimal) {
throw new Error("Cannot instantiate AbstractAnimal directly")
}
}
}
class Dog extends AbstractAnimal {}
const d = new Dog() // OKMixin — bir nechta classlar yoki funksional metodlarni birlashtirish usuli.
let sayHiMixin = {
sayHi() {
console.log(`Hi ${this.name}`)
}
}
class User {
constructor(name) {
this.name = name
}
}
Object.assign(User.prototype, sayHiMixin)
new User("Ali").sayHi() // Hi Aliinstanceof operatori obyekt qaysi classdan yaratilganini tekshiradi.
class Person {}
const p = new Person()
console.log(p instanceof Person) // true
console.log(p instanceof Object) // truethis — hozirgi kontekstdagi obyektga ishora qiladi. Class ichida obyektga murojaat qilish uchun ishlatiladi.
class Person {
constructor(name) {
this.name = name
}
sayName() {
console.log(this.name)
}
}
const p = new Person("Ali")
p.sayName() // Ali-
Encapsulation — Obyekt ichidagi ma’lumotlar (data) va funksiyalar (metodlar) bir joyda saqlanadi. Shu orqali tashqi kod obyektning ichki ishini bevosita o‘zgartira olmaydi va faqat ruxsat etilgan metodlar orqali unga murojaat qilinadi. Bu ma’lumotlarni himoya qilish va kodni yanada barqaror qilishga yordam beradi.
-
Inheritance — Bir class (child class) boshqa class (parent class) metodlari va propertylarini meros qilib oladi. Bu orqali kodni takrorlamasdan qayta ishlatish, classlar orasida bog‘lanish yaratish va tizimni modularga ajratish mumkin.
-
Polymorphism — Bir xil nomdagi metod yoki interfeys turli classlarda turlicha ishlash qobiliyati. Masalan,
speak()metodi Animal classida umumiy bo‘lishi mumkin, lekin Dog va Cat classlarida har biri o‘ziga xos ovoz chiqaradi. Shu bilan birga bir xil kod bir nechta obyekt bilan ishlay oladi. -
Abstraction — Murakkab tizimlarni soddalashtirish va faqat kerakli qismini ko‘rsatish prinsipi. Bu orqali foydalanuvchi yoki boshqa kod obyektning ichki tafsilotlari bilan shug‘ullanishi shart emas, faqat belgilangan metodlar va interfeys orqali ishlaydi. Masalan, avtomobilni haydashda dvigatel ichki ishlashini bilish shart emas, faqat
start()vastop()tugmalari bilan boshqariladi.
class Animal {
speak() { console.log("Animal speaks") }
}
class Dog extends Animal {
speak() { console.log("Dog barks") }
}
const a = new Animal()
const d = new Dog()
a.speak() // Animal speaks
d.speak() // Dog barks