Все знают, что JavaScript - динамический язык, что несет за собой некоторые особенности, например, отсутствие констант. Правильнее было бы сказать, что отсутствие констант - это проблема не самого JavaScript, а браузеров. 

Согласно спецификации ECMAScript 5th Edition, ECMA Script (для простоты понимания и удобства буду использовать термин JavaScript) у объекта Object должен быть метод freeze, который принимает объект и создает на его основе новый неизменяемый (inmutable) объект, у которого все свойства становятся read only и пропадает возможность удалить и/или изменять свойства объекта.

Синтаксис очень простой: Object.freeze(obj);

Для проверки, является ли объект замороженным, существует метод Object.isFrozen(obj).

Пример небольшого кода, чтобы убедится что все работает:

var obj =
   {
      prop: function () {},
      foo: "bar"
   };   
obj.foo = "baz";
obj.lumpy = "woof";
delete obj.prop;
var o = Object.freeze(obj);
alert(o === obj);
alert(Object.isFrozen(obj) === true);
alert(obj.foo);
obj.foo = "hello";
alert(obj.foo);
delete obj.foo;
alert(obj.foo);
obj.func = "function";
alert(obj.function);

Более детальное описание и примеры можно найти на страницы разработчиков FireFox: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/freeze

И всё было бы хорошо, если б не браузеры, а, точнее, их поддержка или неподдержка метода Object.freeze. Если верить таблице http://kangax.github.com/es5-compat-table/, то его поддерживают только последние версии Internet Explorer, FireFox, Google Chrome и всё. Такой код не будет работать в Safari и Opera, что практически уничтожает всю полезность данного подхода. 

Так что использовать такие “константы” или нет - решать нужно исход из специфики проекта, а именно - списка поддерживаемых браузеров. В моём случае, к сожалению, поддержка Safari и Internet Explorer 8 намного важнее, чем использование почти настоящих констант в JavaScript’е.

 


Comments are closed