Что ж, я столкнулся с вопросом, когда пытаюсь использовать полифилл Object.watch
в Chrome. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/watch https://gist.github.com/eligrey/384583
Полифил довольно короткий, и вы можете прочитать, как он удаляет исходное свойство и сразу же определяет новое свойство с тем же значением, но с переопределением геттера и сеттера.
Проблема в том, что если вы используете этот полифилл и смотрите на o.p:
var o = { p: 1 };
o.watch("p", function (id, oldval, newval) {
console.log( "o." + id + " changed from " + oldval + " to " + newval );
return newval;
});
После этого вы проверяете объект o
в chrome devtool. Хлопнуть! Объект o
сейчас пуст! На самом деле у него все еще есть свойство p
, введите o.p
, вы найдете o.p = 1
.
Мой вопрос: почему это свойство невидимо в списке свойств объектов инструментов разработчика Chrome?
Примечание: если вы не знаете/не интересуетесь Object.watch
, вы все равно можете помочь мне в этом вопросе, если хорошо понимаете Object.defineProperty
.
Изменить: оказывается, это совсем не то, что я думал, что оно создает новое свойство, только переопределяя его геттер и сеттер. Цитата из https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty «Дескрипторы свойств, присутствующие в объектах, бывают двух основных разновидностей: дескрипторы данных и дескрипторы доступа. Дескриптор данных — это свойство, которое имеет значение , который может быть доступен или не доступен для записи. Дескриптор доступа — это свойство, описываемое парой функций получения-установки».
Таким образом, похоже, что полифил изменяет целевое свойство со «свойства данных» на «свойство доступа». Я предполагаю, что единственный способ полифилла это?
getter
иsetter
полифилломwatch
. Вот какwatch
узнает, когда он изменен. - person Xotic750   schedule 18.07.2013