1

Есть ли способ добавить «скрытые» неперечислимые свойства к объекту JavaScript, который работает кросс-браузер?Как добавить неперечислимое свойство в JavaScript для IE8?

Для большинства современных браузеров, вы можете сделать:

Object.defineProperty(obj, '__id__', { enumerable: false, value: id++ }); 

Для некоторых старых браузеров не-IE, которые не имеют Object.defineProperty, вы можете использовать the __proto__ hack.

Ни один из них, однако, не работает для IE. Есть ли способ сделать это в IE8 (было бы здорово, если IE7 тоже, но не обязательно)?

Основная цель - добавить свойства трекера к любому объекту JavaScript {}, но при вызове JSON.stringify(obj) он не входит в состав объекта. Я понимаю, что вы можете добавить пользовательские функции замены JSON (в основном расширяя функциональность JSON.stringify), но я не большой поклонник этого, потому что это означает, что когда вы сериализовали эти отслеживаемые объекты JavaScript в JSON, вам нужно было бы знать/не забывать добавлять что функция замены, которая довольно непрактична.

Есть ли способ сделать это?

+0

Вы говорите, что IE8 +, но не работает 'Object.defineProperty()' в IE9? – nnnnnn

+0

О да, наверное, я имею в виду IE8. Если есть способ поддержать IE7, это было бы потрясающе, но в основном просто, как это сделать в IE8. Обновленный вопрос. –

ответ

2

Ну, я не могу воспроизвести его в режиме совместимости IE8 в IE10, но , определяющий свойство вроде "toLocaleString", должен работать из-за the don't enum bug in IE8.

var uniqueId = function() { 
    var dontEnumBug = false; 
    var id = 0; 

    if(!Object.defineProperty) { 
     var keyVisited = false; 
     for(var k in {toLocaleString: 3}) { 
      if(k === "toLocaleString") { 
       keyVisited = true; 
      } 
     } 
     if(!keyVisited) { 
      dontEnumBug = true; 
     } 
    } 

    return function(obj) { 
     if(dontEnumBug) { 
      obj.toLocaleString = id++; 
     } 
     else { 
      Object.defineProperty(obj, '__id__', { enumerable: false, value: id++ }); 
     } 

    } 

})(); 

Вы также можете использовать "isPrototypeOf" или "propertyIsEnumerable" как это также функции, которые не являются в значительной степени никогда не называли.

+0

ah прекрасный! это прекрасно, спасибо :) –

+0

@LancePollard Я думаю, что была ошибка .. просто не используйте этот код ok lol – Esailija

+0

haha ​​звучит хорошо –

 Смежные вопросы

  • Нет связанных вопросов^_^