Օբյեկտների կառուցման մեթոդները
Օբյեկտների կառուցման մեթոդները 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-ի մակարդակում։