В пятницу мы писали про то, что классы — это не «синтаксический сахар» для функций-конструкторов и назвали первую причину, почему это так.
⚫Сегодня разбираем вторую причину.
Методы класса не являются его свойствами, а значит, не могут быть использованы как ключи в цикле for-in.
function UserFn(name, age) {
this.name = name;
this.age = age;
return {
name,
age,
greet() {
console.log('Hi!');
},
};
}
class UserClass {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log('Hi!');
}
}
const UserFromFunction = new UserFn('John', 25);
const UserFromClass = new UserClass('John', 25);
for (const key in UserFromFunction) {
console.log(key); // name, age, greet
}
for (const key in UserFromClass) {
console.log(key); // name, age
}
Также мы можем это проверить с помощью метода Object.getOwnPropertyDescriptor, который возвращает информацию обо всех дескрипторах свойства объекта. У метода класса их нет, а это доказывает, что метод класса технически не является его свойством. console.log(Object.getOwnPropertyDescriptor(UserFromFunction, 'greet')) // Объект с дескрипторамиЭто особенно полезно в тех случаях, когда вам нужно циклом перебрать свойства объекта, и вы не хотите включать его методы в итерации цикла.
console.log(Object.getOwnPropertyDescriptor(UserFromClass, 'greet')) // undefined
Осталось разобрать последнюю особенность классов — следите за постами в канале 🕓.
@chulakov_dev
