Օբյեկտների կառուցման մեթոդները JavaScript-ում
Օբյեկտները JavaScript-ում հանդիսանում են հիմնական կառուցվածքային միավոր՝ տվյալներ և վարքագիծ (մեթոդներ) համադրելու համար։ Մինչև ES6 class սինտաքսի ի հայտ գալը, ծրագրավորողները տարբեր մեթոդներով էին ստեղծում օբյեկտներ՝ object literal, factory functions, constructor functions և Object.create()։ Այս մասում կվերլուծենք այդ մեթոդներն engine-ի մակարդակով և ցույց կտանք երբ որն ընտրել։
1. Object Literal
Օբյեկտ ստեղծելու ամենահեշտ ու տարածված ձևը։ Հարմար է պարզ տվյալների կամ մեկանգամյա օգտագործման համար։
const user = { name: 'Anna', greet() { console.log(`Hi, I'm ${this.name}`); } };
user.greet(); // Hi, I'm Anna
Ներքին կառուցվածք. JavaScript engine-ը ստեղծում է նոր օբյեկտ, որի [[Prototype]]-ը ուղղված է դեպի Object.prototype։
Առավելություններ․
- Արագ և ընթեռնելի
- Հարմար կոնֆիգուրացիաների, settings-ների կամ փոքր օբյեկտների համար
Թերություններ․
- Չի ապահովում օբյեկտի կառուցվածքի վերօգտագործում
- Չկա inheritance կամ instance control
2. Factory Function
Սովորական ֆունկցիա, որը վերադարձնում է նոր օբյեկտ։ Սա տալիս է վերահսկողություն և աբստրակցիա՝ առանց new keyword-ի։
function createUser(name) { return { name, greet() { console.log(`Hello, ${this.name}`); } }; }
const user1 = createUser('Ani'); const user2 = createUser('Karen');
Առավելություններ․
- Կարելի է օգտագործել private data՝ փակման (closure) միջոցով
- Չկա անհրաժեշտություն
new-ի կամthis-ի
Թերություններ․
- Յուրաքանչյուր instance-ում մեթոդները նորից են ստեղծվում (memory inefficient)
Որպես լուծում՝ կարելի է մեթոդները դնել prototype-ում, բայց այն արդեն մոտենում է constructor function-ին։
3. Constructor Function
Մինչև class-ի ի հայտ գալը սա էր օբյեկտները «դասերի» նման ստեղծելու հիմնական միջոցը։
function User(name) { this.name = name; }
User.prototype.greet = function() { console.log(Hello, ${this.name}); };
const u1 = new User('Narek');
Ներքին գործընթաց․
- Ստեղծվում է դատարկ օբյեկտ
- Այս օբյեկտը կապվում է
User.prototype-ին -
this-ը կապվում է այդ օբյեկտին - Վերադարձվում է այդ օբյեկտը
Առավելություններ․
- Մեթոդները լինում են prototype-ում՝ արդյունավետ հիշողության օգտագործմամբ
- Ստանդարտ OOP սինտաքսին մոտ մոտեցում
Թերություններ․
- Պետք է անպայման օգտագործել
new, հակառակ դեպքումthis-ը սխալ կհղվի
4. Object.create()
Այս մեթոդը ստեղծում է նոր օբյեկտ, որի [[Prototype]]-ը ուղղված է դեպի նշված օբյեկտը։ Սա իդեալական է մանրակրկիտ inheritance կառուցելու համար։
const userProto = { greet() { console.log(`Hi, I'm ${this.name}`); } };
const user = Object.create(userProto); user.name = 'Mariam'; user.greet(); // Hi, I'm Mariam
Առավելություններ․
- Մաքուր inheritance
- Իդեալական
Object Delegation-ի համար
Թերություններ․
- Անհասկանալի սինտաքս անծանոթների համար
- Նման չէ class-based ստանդարտներին
Որ մեթոդը երբ օգտագործել
- Object Literal — արագ ու պարզ օբյեկտներ՝ առանց անհրաժեշտության կառուցվածքի վերօգտագործման
- Factory Function — երբ պետք է ունենանք փակված տվյալներ կամ ստեղծման լրացուցիչ վերահսկողություն
- Constructor Function — երբ պետք է արդյունավետ reuse և հիշողության կառավարում
- Object.create — երբ պետք է կառուցել մանրակրկիտ prototype inheritance համակարգ
Եզրակացություն
JavaScript-ը օբյեկտներ ստեղծելու բազմաթիվ միջոցներ է առաջարկում՝ յուրաքանչյուրը՝ տարբեր նպատակների համար։ Իրականում դրանք engine-ի մակարդակով բոլորն էլ ստեղծում են օբյեկտ, սակայն տարբեր են prototype կապի, մեթոդների տեղակայման, հիշողության արդյունավետության և վերահսկողության տեսանկյունից։
Հաջորդ մասում կխոսենք ES6 class սինտաքսի մասին՝ ինչպես է այն միայն sugar, և ինչպես է այն արտացոլվում engine-ի մակարդակում։