Օբյեկտների կառուցման մեթոդները
Օբյեկտների կառուցման մեթոդները JavaScript-ում
Օբյեկտները JavaScript-ում հանդիսանում են հիմնական կառուցվածքային միավոր՝ տվյալներ և վարքագիծ (մեթոդներ) համադրելու համար։ Մինչև ES6 class սինտաքսի ի հայտ գալը, ծրագրավորողները տարբեր մեթոդներով էին ստեղծում օբյեկտներ՝ object literal, factory functions, constructor functions և Object.create()։ Այս մասում կվերլուծենք այդ մեթոդներն engine-ի մակարդակով և ցույց կտանք երբ որն ընտրել։
Օբյեկտ ստեղծելու ամենահեշտ ու տարածված ձևը։ Հարմար է պարզ տվյալների կամ մեկանգամյա օգտագործման համար։
const user = { name: 'Anna', greet() { console.log(`Hi, I'm ${this.name}`); } };
user.greet(); // Hi, I'm Anna
Ներքին կառուցվածք. JavaScript engine-ը ստեղծում է նոր օբյեկտ, որի [[Prototype]]-ը ուղղված է դեպի Object.prototype։
Առավելություններ․
Թերություններ․
Սովորական ֆունկցիա, որը վերադարձնում է նոր օբյեկտ։ Սա տալիս է վերահսկողություն և աբստրակցիա՝ առանց new keyword-ի։
function createUser(name) { return { name, greet() { console.log(`Hello, ${this.name}`); } }; }
const user1 = createUser('Ani'); const user2 = createUser('Karen');
Առավելություններ․
new-ի կամ this-ի Թերություններ․
Որպես լուծում՝ կարելի է մեթոդները դնել prototype-ում, բայց այն արդեն մոտենում է 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-ը կապվում է այդ օբյեկտին
Առավելություններ․
Թերություններ․
new, հակառակ դեպքում this-ը սխալ կհղվի Այս մեթոդը ստեղծում է նոր օբյեկտ, որի [[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
Առավելություններ․
Object Delegation-ի համար Թերություններ․
JavaScript-ը օբյեկտներ ստեղծելու բազմաթիվ միջոցներ է առաջարկում՝ յուրաքանչյուրը՝ տարբեր նպատակների համար։ Իրականում դրանք engine-ի մակարդակով բոլորն էլ ստեղծում են օբյեկտ, սակայն տարբեր են prototype կապի, մեթոդների տեղակայման, հիշողության արդյունավետության և վերահսկողության տեսանկյունից։
Հաջորդ մասում կխոսենք ES6 class սինտաքսի մասին՝ ինչպես է այն միայն sugar, և ինչպես է այն արտացոլվում engine-ի մակարդակում։