Тавзеҳ диҳед, ки чӣ гуна мерос дар JavaScript кор мекунад.
sobes.tech AI
Ҷавоб аз AI
Дарҳақиқат, дар JavaScript меросӣ тавассути прототипҳо амалӣ мешавад. Ҳар як объект дар JavaScript дорои хусусияти дохилӣ [[Prototype]] мебошад, ки ба объекти дигар ишора мекунад. Вақте ки мо кӯшиш мекунем ба хусусият ё усули объект дастрасӣ пайдо кунем, ки мустақиман дар он нест, муҳаррики JavaScript ин хусусият ё усулро дар прототипи он ҷустуҷӯ мекунад. Агар он дар он ҷо пайдо накунад, ҷустуҷӯро дар зери цепи прототипҳо, ки тавассути пайвандҳо [[Prototype]] ташкил шудааст, идома медиҳад, то он ки ба null (охири цепа) расад.
Ду механизми асосии меросӣ мавҷуд аст:
-
Мероси классикӣ бо прототип (ES5 ва қабл): Бар асоси истифодаи функсияҳои конструктор ва хусусияти
prototype-и онҳо.// Функсияи конструктор function Ҷонвар(ном) { this.ном = ном; } // Илова кардани усул ба прототип Ҷонвар.prototype.гуфтан = function() { console.log(`${this.ном} садо мебарорад.`); }; // Сохтани намуна const саг = new Ҷонвар('Саг'); // Дастрасӣ ба усул аз прототип саг.гуфтан(); // Натиҷа: Саг садо мебарорад. // Прототипи `dog` ин `Ҷонвар.prototype` console.log(Object.getPrototypeOf(саг) === Ҷонвар.prototype); // true -
Мероси синфӣ (ES6 ва баъд): Бо истифода аз синтаксис
classваextends, ки дар асл ҳамон прототипҳоро истифода мебарад.// Синфи асосӣ class Ҷонвар { constructor(ном) { this.ном = ном; } гуфтан() { console.log(`${this.ном} садо мебарорад.`); } } // Синфи зер, ки аз Ҷонвар мерос мегирад class Саг extends Ҷонвар { constructor(ном, навъҳо) { super(ном); // Даъвати конструктори синфи падар this.навъҳо = навъҳо; } ҳасад() { console.log(`${this.ном} ҳасад мекунад.`); } } // Сохтани намунаи синфи зер const манСаг = new Саг('Bublik', ['Labrador', 'Collie']); // Дастрасӣ ба усулҳо аз ҳар ду синф манСаг.гуфтан(); // Натиҷа: Bublik садо мебарорад. манСаг.ҳасад(); // Натиҷа: Bublik ҳасад мекунад. // Прототипи `Саг.prototype` ин `Ҷонвар.prototype` console.log(Object.getPrototypeOf(манСаг) === Саг.prototype); // true // Прототипи `Саг.prototype` ин `Ҷонвар.prototype` console.log(Object.getPrototypeOf(Sаг.prototype) === Ҷонвар.prototype); // true
Калидвожаҳо:
-
Занҷири прототипҳо: Вайрон кардани байни объектҳо тавассути
[[Prototype]]. -
__proto__(застар, нестандарт, аммо барои фаҳмидан кӯмак мекунад): Хусусият, ки тавассути он ба[[Prototype]]дастрасӣ пайдо кардан мумкин аст. Дар коди истеҳсолӣ тавсия дода намешавад. -
Object.getPrototypeOf(obj): Роҳи стандартӣ барои гирифтани прототипи объект. -
Object.setPrototypeOf(obj, proto): Роҳи стандартӣ барои тағир додани прототипи объект (намоишан тавсия намешавад, ки прототипи объектҳои мавҷударо пас аз эҷод кардан тағир диҳед). -
instanceof: Оператор барои санҷидани он ки оё объект намунаи синф ё функсияи конструктор аст, тавассути санҷиши занҷири прототипи он.console.log(манСаг instanceof Саг); // true console.log(манСаг instanceof Ҷонвар); // true console.log(манСаг instanceof Object); // true (дар охири занҷир `Object.prototype`) -
super: Дар синфҳо барои даъвати усулҳо ё конструктори синфи падар истифода мешавад.
Фарқият байни роҳи классикӣ ва классӣ: Синфҳо роҳи бештар сохторӣ ва синтаксисӣ қулайро барои кор бо мероси прототипӣ пешниҳод мекунанд, ки ба дигар забонҳои барномасозӣ наздик аст. Аммо механизм асосӣ боқӣ мемонад — меросӣ тавассути прототипҳо.