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]-->