{configurable: false} или Object.seal () работают неправильно [дубликаты]

1

Я пытаюсь изучить javascript и видел, что мы можем играть с атрибутами свойств объекта. (i означает значение, записываемый, перечислимый, настраиваемый).

И из того, что я узнал, я подумал, что изменение {configurable: false} ограничило бы любые изменения конфигурации, такие как {writable: false, enumerable: false}

Я написал ниже, чтобы попробовать, но результаты, которые я получил, не были похожи на результаты, которые я ожидал.

Я ошибаюсь в отношении того, что означает {configurable: false}, или есть что-то не так с кодом? ТИА.

"use strict";

window.onload = function(){

  var o = {x:1};

  //Make "x" non-configurable
  Object.defineProperty(o, "x", {configurable: false});
  //Seal "o";
  Object.seal(o);

  console.log(Object.getOwnPropertyDescriptor(o, "x"));
  //outputs => Object { value: 1, writable: true, enumerable: true, configurable: false }
  console.log(Object.isSealed(o));
  //outputs => true

  Object.defineProperty(o, "x", {writable: false}); //this doesn't cause any errors.
  console.log(Object.getOwnPropertyDescriptor(o, "x"));
  //outputs => Object { value: 1, writable: false, enumerable: true, configurable: false }
}
Теги:
immutability
defineproperty

1 ответ

1
Лучший ответ

MDN - печать

Настраиваемый атрибут
Конфигурируемый атрибут одновременно контролирует, может ли свойство быть удалено из объекта и могут ли быть изменены его атрибуты (кроме записываемых на false)

Объект Object.seal()
метод запечатывает объект, предотвращая добавление новых свойств и маркировку всех существующих свойств как неконфигурируемых. Значения текущих свойств могут быть изменены до тех пор, пока они доступны для записи.

Вам нужно freeze

MDN - замораживание

Сравнение с Object.seal() Объектами, запечатанными Object.seal(), может быть изменено их существующее свойство. Существующие свойства объектов, замороженных с помощью Object.freeze(), становятся неизменными.

"use strict";

window.onload = function(){

  var o = {x:1};

  //Make "x" non-configurable
  Object.defineProperty(o, "x", {configurable: false});
  //freeze "o";
  Object.freeze(o);

  console.log(Object.getOwnPropertyDescriptor(o, "x"));
  //outputs => Object { value: 1, writable: true, enumerable: true, configurable: false }
  console.log(Object.isSealed(o));
  //outputs => true

  Object.defineProperty(o, "x", {writable: true}); //Now this doesn't cause.
  console.log(Object.getOwnPropertyDescriptor(o, "x"));
  //outputs => Object { value: 1, writable: false, enumerable: true, configurable: false }
}
  • 0
    спасибо за введение новой функции, но я не хочу, чтобы все свойства стали доступны только для чтения. Кроме того, установка для записи в false была только для примера. Почему я могу настроить свойство после его запечатывания и пометки «Настраиваемое»?
  • 0
    Потому что seal позволяет редактировать существующие свойства.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню