Я пытаюсь понять метод Object.freeze для ECMAscript.Javascript Object.freeze() не предотвращает изменения объекта
Мое понимание заключалось в том, что оно по существу останавливает изменения во всех свойствах объекта. Документация MDN гласит:
Предотвращает добавление новых свойств; предотвращает удаление существующих свойств; и предотвращает изменение существующих свойств или их перечислимость, настраиваемость или возможность записи.
Это, похоже, не так, но, возможно, я неверно истолковал документы.
Вот мой объект, с его перечислимого собственности exampleArray
function myObject()
{
this.exampleArray = [];
}
var obj = new myObject();
obj.exampleArray[0] = "foo";
Теперь, если я заморозить объект, я ожидал бы свойство exampleArray быть заморожены тоже, так как в нем больше не могут быть изменены каким-либо образом ,
Object.freeze(obj);
obj.exampleArray[1] = "bar";
console.log(obj.exampleArray.length); // logs 2
«массив» был добавлен в массив, таким образом замороженный объект был изменен. Мое немедленное решение - просто заморозить требуемое свойство:
Object.freeze(obj.exampleArray);
obj.exampleArray[2] = "boo";
Теперь изменение массива вызывает ошибку, если требуется.
Однако я разрабатываю приложение и еще не знаю, что будет назначено моему объекту. Моим вариантом использования является то, что у меня есть некоторые игровые объекты, которые инициализируются (из файла XML), когда игра начинается. После этого я не хочу иметь возможность случайно изменить какие-либо их свойства.
Возможно, я злоупотребляю методом замораживания? Я хотел бы иметь возможность заморозить весь объект, своего рода рекурсивное замораживание. Лучшее решение, о котором я могу думать здесь, - это перебрать свойства и заморозить каждый из них.
Я уже искал этот вопрос, и единственный ответ говорит, что это ошибка реализации. Я использую новейшую версию Chrome. Любая помощь приветствуется.
Половина этой страницы: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze это говорит: ** Следующий пример показывает, что значения объекта в замороженном объект может быть мутирован (замораживание неглубоко). ** Таким образом, он работает как разработанный. –