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}`;
};