Доступ к свойствам, скрытым __defineGetter __ / __ defineSetter__ в JavaScript - PullRequest
5 голосов
/ 24 мая 2011

Я пытаюсь определить пользовательский установщик для свойства innerHTML. К сожалению, я не могу получить доступ к базовому свойству после того, как я определил функцию установки:

$('body')[0].__defineSetter__("innerHTML",
  function (val) {
    alert("Setting to: " + val);
    this.innerHTML = val;
});

Этот фрагмент заполняет стек вызовов, потому что назначение рекурсивно вызывает сеттер. Очевидно, innerHTML уже перегружено в IE8, и вы можете просто сохранить старую пару get / set и использовать ее в дескрипторе нового свойства. Взято из MSDN:

var innerHTMLdescriptor = Object.getOwnPropertyDescriptor(Element.prototype, 'innerHTML');
Object.defineProperty(Element.prototype, 'innerHTML',
  { set: function(htmlVal) {
      var safeHTML = toStaticHTML(htmlVal);
      innerHTMLdescriptor.set.call(this, safeHTML);
    }
});

Однако, похоже, это не относится к Chrome, где getOwnPropertyDescriptor возвращает неопределенное значение для innerHTML. В таком случае, как мне получить доступ к базовому свойству?

Дополнительный вопрос: как мне обеспечить, чтобы все объекты, созданные в будущем, имели такое специальное поведение innerHTML? Возможно ли использовать прототипы DOM для этого? Кажется, что перегрузка функции здесь не то, что мне нужно. Возможно, можно перегрузить конструктор DOM и добавить вызов __defineGetter__/defineProperty, но похоже, что поддержка конструкторов не распространена, поэтому я хотел бы знать, есть ли альтернатива.

1 Ответ

1 голос
/ 18 октября 2011

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

var _innerHTML = "";

this.__defineSetter__( "innerHTML",
    function (val) {
        alert("Setting to: " + val);
        _innerHTML = val;
    } );

this.__defineGetter__( "innerHTML",
    function () {
        return _innerHTML;
    } );

Однако я обнаружил, что использование методов получения и установки в существующих свойствах DOM часто просто не работает из-за специальной внутренней обработки этих свойств.Например, он не будет работать со свойством value текста input.Я ожидаю, что innerHTML будет в одной лодке.

...