Object.defineProperty для всех браузеров?

Запрос об Object.defineProperty, как показано ниже:

function testComponent(){
    var testProperty;
    Object.defineProperty(this, "testProperty",
    {
        get : function()
        {
           return testProperty;
        },
        set : function(val)
        {
          testProperty = val;
        }
    });
}

Где он будет использоваться так:

testObject = new testComponent();
testObject.testProperty = "testValue";

Основываясь на том, что я видел до сих пор, похоже, что нет перекрестного браузера, поскольку я пытался использовать es5-shim без везения, но я хотел бы подтвердить. Я также нашел ссылку на этот пост, и мои тесты все еще терпят неудачу в IE 7 и 8, может ли кто-нибудь пролить свет на это?

Я помню, что несколько месяцев назад я узнал о каком-то связанном вопросе где-то на S/O, и я думаю, что видел, что кто-то написал для этого решение в ответ. Любые общие обходные пути для геттеров/сеттеров также будут оценены. Идея состоит в том, что мне нужен какой-то эквивалент устройства-получателя на объекте, не передавая изменение параметра с помощью метода. Мне не нужен IE6, но я бы хотел поддерживать браузеры в диапазоне IE7 + ff 3.6+ и т.д.


Тесты QUnit ниже: (jsFiddles)

(они передаются во всех браузерах на моей машине, кроме IE 7 и 8

прямое использование defineProperty, без прокладок:
http://jsfiddle.net/uSYFE/

скрипка с использованием прокладки ES5, я предполагаю, что все, что мне нужно сделать, это включить его?:
http://jsfiddle.net/hyperthalamus/ntwDy/

скрипт с использованием рекомендуемого IE решения:
http://jsfiddle.net/hyperthalamus/xfvz3/

Ответ 1

Согласно ES5-shim:

/!\Object.defineProperty

Этот метод будет молча выполнять настройки "записываемый", "перечислимый" и "настраиваемый".

Предоставление геттера или сеттера с "get" или "set" в дескрипторе будет бесшумно терпеть неудачу на машинах, которым не хватает "defineGetter" и "defineSetter", которые до сих пор включают все версии IE до версии 8.

IE 8 предоставляет версию этого метода, но он работает только с объектами DOM. Таким образом, прокладка не будет установлена, и попытки установить свойства "значение" будут терпеть неудачу на не-DOM-объектах.

https://github.com/kriskowal/es5-shim/issues#issue/5

Итак, вы знаете свой ответ. Это можно сделать на элементах DOM, чтобы он (и только на IE8).

Я бы предложил вам использовать методы get/set, если вы хотите, чтобы IE7 работал.

Ответ 2

Для старых IE вам нужно убедиться, что ваша собственность является объектом dom (даже фальшивым тегом) и использует onPropertyChange для получения уведомления. Подробнее см. В этом сообщении John Dyer.

Ответ 3

У меня был такой же вопрос. (см. здесь). Это не похоже на то, что это возможно в IE8 или ниже. В противном случае лучшим выбором будет ES5 Shim.