Javascript: объект не поддерживает метод 'freeze'
Я пытаюсь создать enumeration в Javascript.
Используемый код javascript
var FeatureName = {
"FEATURE1": 1,
"FEATURE2": 2,
"FEATURE3": 3,
"FEATURE4": 4,
"FEATURE5": 5
}
Object.freeze(FeatureName);
Когда используется метод Object.freeze(FeatureName), он отлично работает для всех браузеров, кроме IE7 и IE8. Есть ли альтернатива этому?
Ответы
Ответ 1
Джон Ресиг предлагает альтернативу. Я не пробовал это в браузерах, которые вы упомянули. Попробуйте и сообщите нам.
http://ejohn.org/blog/ecmascript-5-objects-and-properties/
Object.freeze = function( obj ) {
var props = Object.getOwnPropertyNames( obj );
for ( var i = 0; i < props.length; i++ ) {
var desc = Object.getOwnPropertyDescriptor( obj, props[i] );
if ( "value" in desc ) {
desc.writable = false;
}
desc.configurable = false;
Object.defineProperty( obj, props[i], desc );
}
return Object.preventExtensions( obj );
};
Ответ 2
Вы можете добавить es5-sham "monkey-patch" (нужно только добавить es5-sham.min.js
) на свою страницу, но это важно понять, что это просто предотвратит появление ошибки.
Это не правда polyfill; из проекта README на Github:
Object.freeze
Безмолвно проваливается во всех устаревших машинах. Это должно быть хорошо, если вы не зависите от положений безопасности и безопасности этого метода, которые вы не можете получить в устаревших двигателях.
Эта библиотека также доступна из cdnjs, если вы хотите использовать CDN.
Вы можете включить его с таким кодом (обратите внимание на теги, ограничивающие его до версии 8 и старше):
<!--[if lt IE 9]>
<script src="//cdnjs.cloudflare.com/ajax/libs/es5-shim/4.0.5/es5-sham.min.js" type="text/javascript"></script>
<![endif]-->