Hoisting va prototiplar
JS kodi bajarilishidan oldin nima bo'ladi? Prototip zanjiri qanday ishlaydi?
Hoisting va prototiplar
JS ichida nima kechadi — var va let farqi, funksiyalarning «ko'tarilishi», meros zanjiri.
Dars rejasi
6 ta mavzu1. Hoisting nima?
Hoisting — JS kod bajarilishidan oldin deklaratsiyalarni scope boshiga «ko'taradi». Bu sababli funksiya/o'zgaruvchini e'lon qilmasdan oldin ham ishlatish mumkin bo'lishi mumkin.
1// Siz yozgan kod2console.log(x); // undefined (xato EMAS!)3var x = 5;4console.log(x); // 55
6// JS uni shunday ko'radi7var x; // «ko'tarildi» (declaration)8console.log(x); // undefined9x = 5; // qiymat shu yerda beriladi10console.log(x); // 52. var vs let/const
1// var — hoisting bor, boshlang'ich undefined2console.log(a); // undefined3var a = 10;4
5// let/const — hoisting bor, lekin «Temporal Dead Zone» (TDZ)6console.log(b); // ReferenceError!7let b = 20;8
9// const ham xuddi shunday10console.log(c); // ReferenceError!11const c = 30;var
Hoisting + undefined. Eski, muammoli.
let
Hoisting + TDZ. Modern tanlov (o'zgaradi).
const
Hoisting + TDZ + o'zgarmas. Default tanlov.
3. Funksiya hoisting
1salom(); // "Salom!" — ishlaydi!2
3function salom() {4 console.log("Salom!");5}1salom(); // TypeError: salom is not a function2
3var salom = function() {4 console.log("Salom!");5};6
7// let bilan esa — ReferenceError8salom2(); // ReferenceError9
10let salom2 = function() {};4. Prototip nima?
Har bir JS obyektning yashirin «ota-obyekti» bor — bu uning prototipi. Agar obyektda biror xossa topilmasa, JS prototipdan qidiradi.
1const ota = {2 familiya: "Valiyev",3 tanishtir() {4 return "Men " + this.ism + " " + this.familiya;5 },6};7
8const bola = Object.create(ota);9bola.ism = "Ali";10
11console.log(bola.ism); // "Ali"12console.log(bola.familiya); // "Valiyev" — ota'dan olindi!13console.log(bola.tanishtir()); // "Men Ali Valiyev"14
15// Prototipni ko'rish16Object.getPrototypeOf(bola) === ota // true17bola.__proto__ === ota // true (eski usul)5. Prototip zanjiri
Prototipning ham prototipi bo'lishi mumkin. JS xossa topilmagunicha zanjir bo'ylab yuqoriga chiqadi. Oxirida Object.prototype, undan keyin — null.
1const hayvon = {2 nafas() { return "Nafas olmoqda"; },3};4
5const sut = Object.create(hayvon);6sut.sut = () => "Sut beradi";7
8const mushuk = Object.create(sut);9mushuk.ism = "Moshka";10mushuk.miyov = () => "Miyov!";11
12console.log(mushuk.ism); // "Moshka" (o'zidan)13console.log(mushuk.miyov()); // "Miyov!" (o'zidan)14console.log(mushuk.sut()); // "Sut beradi" (sut'dan)15console.log(mushuk.nafas()); // "Nafas olmoqda" (hayvon'dan)16
17// Zanjir: mushuk → sut → hayvon → Object.prototype → null6. Object.create va meros
1// Prototip asosida obyekt yaratish2const hayvonProto = {3 yur() { return this.ism + " yurmoqda"; },4 uyquga() { return this.ism + " uxladi"; },5};6
7function hayvonYarat(ism) {8 const yangi = Object.create(hayvonProto);9 yangi.ism = ism;10 return yangi;11}12
13const sher = hayvonYarat("Simba");14console.log(sher.yur()); // "Simba yurmoqda"15console.log(sher.uyquga()); // "Simba uxladi"16
17// hasOwnProperty — faqat o'zining xossasi?18sher.hasOwnProperty("ism") // true19sher.hasOwnProperty("yur") // false (prototipdan)Kichik test
0 / 51.console.log(x); var x = 5; — natija?
2.console.log(x); let x = 5; — natija?
3.Obyektda xossa topilmasa, JS qayerdan qidiradi?
4.Object.create(ota) nima qaytaradi?
5.Prototip zanjiri oxirida nima bor?