Object.create vs class syntax
Object.create() vs class syntax JavaScript-ում
Երբ նոր ես սկսում JavaScript սովորել, օբյեկտների ստեղծման համար սովորաբար պարզապես գրում ես {}։ Բայց երբ արդեն փորձում ես կառուցել ավելի խելացի բաներ՝ օրինակ՝ կրկնվող օբյեկտներ որոշ ընդհանուր պահվածքով, պետք է որոշես՝ ո՞ր եղանակով ստեղծես օբյեկտ։
Հենց այստեղ են հայտնվում երկու հայտնի մոտեցումներ՝
Երկուսն էլ օգտագործվում են, երկուսն էլ կապ ունեն prototype համակարգի հետ։ Բայց տարբերություն կա թե ոնց են դրանք աշխատում, և ինչի համար են ավելի հարմար։
const animal = { speak() { console.log(`I'm a ${this.type}`); } }; const cat = Object.create(animal); cat.type = "cat"; cat.speak(); // I'm a cat
Բայց ի՞նչ է այստեղ տեղի ունենում
Սա է կոչվում prototype chain։
class Animal { constructor(type) { this.type = type; } speak() { console.log(`I'm a ${this.type}`); } } const cat = new Animal("cat"); cat.speak(); // I'm a cat
Ի՞նչ տարբերություն կա
Ստեղծածդ նույն բանն է, բայց այլ ձևով։ class-ը սինթաքսային շաքար է՝ իրականում ներքուստ աշխատում է նույն պրոտոտիպային մեխանիզմով։
Երբ օգտագործում ես Object.create(), դու կարող ես միանգամից ասել՝ այս հատկությունը
const user = Object.create({}, { name: { value: "Anna", writable: false, enumerable: true } }); user.name = "Lilit"; console.log(user.name); // "Anna"
Իսկ class-ով նման բան անելը բարդ է
Դու պետք է օգտագործես Object.defineProperty constructor-ի ներսում, ինչը կոդդ կդարձնի ավելի բարդ ու անհասկանալի։
class User { constructor(name) { Object.defineProperty(this, 'name', { value: name, writable: false, enumerable: true }); } }
Այս երկու եղանակներն էլ ստեղծում են prototype-based ժառանգություն։ Բայց class-ը ավելի նոր ու "համալրված" սինթաքս է, իսկ Object.create()-ը՝ ցածր մակարդակի ու ավելի ճկուն։
class Person { constructor(name) { this.name = name; } } // Սա նույնն է, ինչ այս կոդը function Person(name) { this.name = name; } Person.prototype.greet = function () { return `Hello, I'm ${this.name}`; };