Ответ
Ответ не найден
Ответ 18+ 🔞
А, ну это ж классика, блядь! Смотри, есть такая штука — Object.defineProperty(). Ну, вроде как обычное свойство объекта создаёшь, но нет, блядь, тут целый ёперный театр начинается!
Представь, у тебя есть объект, обычный такой, ни о чём не подозревающий:
let user = {
name: 'Вася'
};
И ты такой: "Хочу, чтобы свойство age было не просто свойством, а с прибамбасами!". Ну, чтобы его нельзя было просто так перезаписать, или чтобы при каждом обращении к нему что-то происходило, или чтобы оно вообще из ниоткуда бралось, как хуй с горы.
Вот для этого и нужен defineProperty. Берёшь объект, берёшь имя свойства и третий аргумент — дескриптор. А это, блядь, уже не просто значение, а целый объект с настройками, ядрёна вошь!
Самые главные настройки — это get и set. Это функции, чувак. get вызывается, когда кто-то пытается прочитать твоё свойство. А set — когда кто-то пытается ему присвоить значение.
Вот смотри, какую хуйню можно сделать:
let user = {
name: 'Вася',
surname: 'Пупкин'
};
Object.defineProperty(user, 'fullName', {
get() {
return `${this.name} ${this.surname}`;
},
set(value) {
[this.name, this.surname] = value.split(' ');
}
});
console.log(user.fullName); // Вася Пупкин
user.fullName = 'Иван Сидоров';
console.log(user.name); // Иван
console.log(user.surname); // Сидоров
Видишь? Свойства fullName в объекте нет, нихуя! Но когда к нему обращаются — функция get срабатывает и возвращает результат. А когда пытаются записать — set разбивает строку и раскидывает куски по настоящим свойствам. Красота, блядь!
Но это ещё не всё, есть и другие флаги в дескрипторе:
enumerable— еслиfalse, то свойство не будет показываться в циклахfor..inи вObject.keys(). Спрятал, сука, как хитрая жопа.configurable— еслиfalse, то свойство нельзя будет удалитьdeleteи нельзя будет изменить его дескриптор потом ещё раз. Замуровал, демоны!writable— еслиfalse, то значение свойства нельзя будет изменить (но это работает только для обычных свойств "данных", а не для геттеров/сеттеров).
Вот так, одной строчкой можно создать свойство, которое ведёт себя не как все, с характером. Полезная штука, особенно когда нужно контролировать доступ к данным или делать вычисляемые поля. Главное — не переборщить, а то получится код, в котором нихуя не разберёшься, кроме тебя самого, да и то через месяц.