Կլասներ JavaScript-ում
Կլասներ JavaScript-ում — ES6 սինտաքսի խորությունը և prototype-ի հարաբերակցությունը
JavaScript-ը երկար ժամանակ չուներ «կլաս» հասկացությունը ավանդական իմաստով, ինչպիսին դա տեսնում ենք Java, C++ կամ Python լեզուներում։ Սակայն ES6 (2015)-ից սկսած ներդրվեց class
սինտաքսը՝ ավելի պարզ և ընթեռնելի ձևով կառուցելու constructor-հիմնված օբյեկտներ։ Այս հոդվածում կբացատրենք, թե ինչպես է class
-ը իրականում «syntactic sugar»՝ constructor function-ի վրա, ինչպես է աշխատում prototype chain
-ը և ինչ անել-չանել class-երի հետ։
class User { constructor(name) { this.name = name; }
greet() { console.log(Hello, ${this.name}); } }
const u = new User('Ani'); u.greet(); // Hello, Ani
Ինչ է կատարվում ներքուստ.
User
անունով greet()
մեթոդը ավելացվում է User.prototype
-ի վրա
prototype
-ը Այսինքն՝ վերը նշված class-ը engine-ի մակարդակով գրեթե նույնն է, ինչ հետևյալ constructor function-ը․
function User(name) { this.name = name; }
User.prototype.greet = function() { console.log(Hello, ${this.name}); };
Կլասները իրականացնում են նույն prototype-based inheritance-ը, բայց ավելի կարդալու համար հարմար սինտաքսով։ Երբ մենք ստեղծում ենք մեթոդ class
-ի ներսում, այն ավտոմատ կերպով ավելացվում է դրա prototype
-ի վրա։
console.log(typeof User); // function console.log(User.prototype.greet); // function greet()
Object instanceof User: նոր օբյեկտը ժառանգում է User.prototype
-ից։
const u = new User('Karen'); console.log(u instanceof User); // true console.log(Object.getPrototypeOf(u) === User.prototype); // true
Կլասը չի hoist-վում (ինչպես function-ը)։ Այսինքն՝ այն պետք է սահմանվի նախքան օգտագործելը։
const u = new User(); // ReferenceError class User {}
Կլասի methods-ները non-enumerable են՝ ի տարբերություն object literal մեթոդների։
console.log(Object.keys(User.prototype)); // []
Կլասները միշտ strict mode-ում են աշխատում։
class Test { constructor() { undeclaredVar = 5; // ReferenceError } }
Կլասի methods-ները writable և configurable են, բայց non-enumerable:
#methodName
)։
class Person { static sayHi() { console.log('Hi from class'); } }
Person.sayHi(); // OK new Person().sayHi(); // TypeError
Փոքր կամ մեկանգամյա օբյեկտների համար լավագույն տարբերակը հաճախ կլինի factory function-ը կամ object literal-ը։
JavaScript-ում class
-ը սինտաքսային sugar է, որը կառուցվում է prototype համակարգի վրա։ Այն չի բերում ամբողջական OOP համակարգ (չնայած նման տեսք ունի), բայց տրամադրում է մաքուր և ընթեռնելի API՝ ժառանգություն, մեթոդների բաժանում և ստատիկ հատկություններ ստեղծելու համար։
Հաջորդ մասում մենք կվերլուծենք ժառանգություն (inheritance) JavaScript class-երի միջոցով՝ ներառյալ extends
, super()
և prototype շղթայի ընդլայնում։