Какие знаешь дескрипторы полей объекта

Ответ

В JavaScript объекты могут иметь поля с различными дескрипторами, которые определяют их поведение. Основные дескрипторы:

  1. value – значение свойства
  2. writable – можно ли изменять значение (true/false)
  3. enumerable – будет ли свойство перечисляться в циклах (true/false)
  4. configurable – можно ли удалять или менять дескрипторы (true/false)
  5. get/set – геттеры и сеттеры свойства

Пример:

const obj = {};
Object.defineProperty(obj, 'readOnlyProp', {
  value: 42,
  writable: false,
  enumerable: true,
  configurable: false
});

console.log(obj.readOnlyProp); // 42
obj.readOnlyProp = 100; // TypeError в strict mode

Ответ 18+ 🔞

А, ну ты глянь, какие у нас в JavaScript объекты хитрые, блядь! Прямо как мартышлюшки с секретами. Свойства-то у них не просто так болтаются, а с целой кучей настроек, дескрипторами этими, ёпта.

Вот представь, у каждого поля есть такая вот, блядь, анкета, где прописано, что оно может, а что нет. Как будто характер у свойства, сука!

  1. value – это, собсно, сама цифра или буква, что там лежит. Значение, короче.
  2. writable – а вот это уже интересно. Можно ли переписать эту хуйню? true – значит да, пиши что хошь. false – сиди и не рыпайся, попробуешь изменить – в лучшем случае нихуя не выйдет, в худшем – ошибка тебе в сраку.
  3. enumerable – будет ли это свойство светиться, когда мы его в циклах типа for...in перебираем. Сделаешь false – и оно как шпион, блядь, в тени останется.
  4. configurable – это вообще мощь! Если false, то ты уже не сможешь ни удалить это свойство, ни поменять его дескрипторы (кроме value и writable, если writable еще true). Закостенело всё, намертво, блядь!
  5. get/set – это уже высший пилотаж, ебать мои старые костыли! Ты не просто значение хранишь, а прицепляешь две функции: одну, когда значение читают, другую – когда записывают. Хитрая жопа!

Ну и смотри, как это выглядит в деле, на примере одного упоротого свойства:

const obj = {};
Object.defineProperty(obj, 'readOnlyProp', {
  value: 42,
  writable: false,
  enumerable: true,
  configurable: false
});

console.log(obj.readOnlyProp); // 42
obj.readOnlyProp = 100; // А вот тут, в строгом режиме, будет пиздец – TypeError!

Создали мы объект, пустой как барабанная перепонка у рокера. А потом бац – Object.defineProperty! И навешиваем на него свойство readOnlyProp. Даём ему священное число 42, запрещаем перезапись (writable: false), разрешаем показываться в переборах, но намертво запрещаем менять настройки (configurable: false).

И что выходит? Прочитать – пожалуйста, 42. А попробуй изменить – получишь, сука, по шапке! Вообще, волнение ебать, какая точность контроля! Можно сделать такое поле, которое только читается, но в цикле не светится. Или наоборот. В общем, полная власть, хуй с горы!