Ответ
В JavaScript объекты могут иметь поля с различными дескрипторами, которые определяют их поведение. Основные дескрипторы:
- value – значение свойства
- writable – можно ли изменять значение (true/false)
- enumerable – будет ли свойство перечисляться в циклах (true/false)
- configurable – можно ли удалять или менять дескрипторы (true/false)
- 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 объекты хитрые, блядь! Прямо как мартышлюшки с секретами. Свойства-то у них не просто так болтаются, а с целой кучей настроек, дескрипторами этими, ёпта.
Вот представь, у каждого поля есть такая вот, блядь, анкета, где прописано, что оно может, а что нет. Как будто характер у свойства, сука!
- value – это, собсно, сама цифра или буква, что там лежит. Значение, короче.
- writable – а вот это уже интересно. Можно ли переписать эту хуйню?
true– значит да, пиши что хошь.false– сиди и не рыпайся, попробуешь изменить – в лучшем случае нихуя не выйдет, в худшем – ошибка тебе в сраку. - enumerable – будет ли это свойство светиться, когда мы его в циклах типа
for...inперебираем. Сделаешьfalse– и оно как шпион, блядь, в тени останется. - configurable – это вообще мощь! Если
false, то ты уже не сможешь ни удалить это свойство, ни поменять его дескрипторы (кромеvalueиwritable, еслиwritableещеtrue). Закостенело всё, намертво, блядь! - 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. А попробуй изменить – получишь, сука, по шапке! Вообще, волнение ебать, какая точность контроля! Можно сделать такое поле, которое только читается, но в цикле не светится. Или наоборот. В общем, полная власть, хуй с горы!