Я только что услышал о методах JavaScript freeze
и seal
, которые можно использовать для того, чтобы сделать любой объект неизменным.
Вот короткий пример, как его использовать:
var o1 = {}, o2 = {};
Object.freeze(o2);
o1["a"] = "worked";
o2["a"] = "worked";
alert(o1["a"]); //prints "worked"
alert(o2["a"]); //prints "undefined"
В чем разница между freeze
и seal
? Могут ли они повысить производительность?
Object.preventExtensions
в дополнение кObject.seal
иObject.freeze
.Object.preventExtensions
просто предотвращает добавление новых предметов к объекту. Вы можете удалять, настраивать и изменять значения свойств объектов, у которых отключена расширяемостьObject.preventExtensions
.Ответы:
Object.seal
delete
вернет falsewritable
атрибут, и ихvalue
атрибут, еслиwriteable
это правда).TypeError
при попытке изменить значение самого запечатанного объекта (чаще всего в строгом режиме )Object.freeze
Object.seal
конкретно, плюс:Ни один из них не влияет на «глубокие» / внуковые объекты. Например, если
obj
он заморожен,obj.el
его нельзя переназначить, но значениеobj.el
можно изменить, например,obj.el.id
можно изменить.Производительность:
Запечатывание или замораживание объекта может повлиять на скорость его перечисления, в зависимости от браузера:
Тесты: Запечатанные объекты , Замороженные объекты .
источник
seal
также делает существующие свойства неконфигурируемыми, см. Jsfiddle.net/btipling/6m743whn Номер 2, вы все еще можете редактировать, то есть изменять значения существующих свойств на запечатанном объекте.onClick
oronlick
и задавались вопросом, почему он не работает. Если JavaScript выдает ошибку, это еще одна вещь, чтобы ошибиться. Во-вторых, это позволяет реализовать постоянные свойства объекта, что предотвращает изменения. Это особенно полезно на объектах.Я написал тестовый проект, который сравнивает эти 3 метода:
Object.freeze()
Object.seal()
Object.preventExtensions()
Мои юнит-тесты охватывают случаи CRUD:
Результат:
источник
DEBUGMODE
переменную и установите ее вtrue
. Тогда делайif (DEBUGMODE) { ... }
. В...
, положите функциональность для обеспечения всех объектов DOM всегда запечатаны. Затем, когда вы будете готовы распространять скрипт веб-страницы, перейдитеDEBUGMODE
на негоfalse
, запустите его через компилятор закрытия и распространите его. Это так просто.element.onlick=something
и расстраиваются, потому что это не работает, но технически это не ошибка.Вы всегда можете посмотреть их в MDN. Коротко:
источник
Object.seal()
Также, кажется, заморозить свойства прототипа: \Object.freeze()
создает замороженный объект, что означает, что он берет существующий объект и, по сути, вызываетObject.seal()
его, но также помечает все свойства «средства доступа к данным»writable:false
, чтобы их значения не могли быть изменены. - Кайл Симпсон, вы не знаете JS - это и прототипы объектовисточник
Я смотрел на различия между Freeze и Seal в ECMAScript 5 и создал сценарий, чтобы прояснить различия. Frozen создает неизменный объект, включающий данные и структуру. Печать предотвращает изменения именованных интерфейсов - не добавляет, не удаляет - но вы можете изменить объект и переопределить значение его интерфейса.
источник
Я знаю, что могу немного опоздать, но
false
. где as в Запечатанном атрибуте для записи установлено значение,true
а остальные атрибуты имеют значение false.источник
Object.getOwnPropertyDescriptor(Object.freeze({ prop: 1 }), 'prop').enumerable
===true
.Теперь вы можете принудительно заморозить одно свойство объекта вместо того, чтобы заморозить весь объект. Вы можете добиться этого с
Object.defineProperty
с вwritable: false
качестве параметра.В этом примере
obj.first
теперь его значение зафиксировано на 99.источник
Я создал простую таблицу, чтобы сравнить приведенные ниже функции и объяснить разницу между этими функциями.
источник