Чем понравилась компания, в которой работал?

Ответ

Ответ не найден

Ответ 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, то значение свойства нельзя будет изменить (но это работает только для обычных свойств "данных", а не для геттеров/сеттеров).

Вот так, одной строчкой можно создать свойство, которое ведёт себя не как все, с характером. Полезная штука, особенно когда нужно контролировать доступ к данным или делать вычисляемые поля. Главное — не переборщить, а то получится код, в котором нихуя не разберёшься, кроме тебя самого, да и то через месяц.