2010-05-05 2 views
9

Простой пример с использованием встроенного объекта javascript: navigator.my_new_property = "some value"; // можем ли мы обнаружить, что это новое свойство было добавлено?Обнаруживать, когда новое свойство добавляется в объект Javascript?

Я не хочу постоянно опроса объекта проверять наличие новых свойств. Существует ли какой-либо тип более высокого уровня для объектов, вместо того, чтобы явно указывать свойство для мониторинга?

Опять же, я не хочу определять, изменилось ли значение свойства, а скорее добавлено новое свойство.

Идеи? спасибо

ответ

6

Nope. Существующие методы определения того, когда имущество записывается в:

  • устройство настройки ECMAScript 5, определенное с использованием defineProperty(obj, name, fn);
  • устаревший JavaScript-установщик, определяемый с использованием __defineSetter__(name, fn);
  • наследство Netscape/Mozilla watch(name, fn);

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

Опрос или явные методы настройки, которые обеспечивают обратный вызов, - это все, что вы можете сделать.

Аналогичная ситуация: Getter/setter on javascript array?

+0

Спасибо за подробный ответ. Если я иду по маршруту опроса, что бы вы считали хорошим интервалом в мс? Очевидно, я хотел бы, чтобы это было эффективным, но не повторять излишне. Существует ли «стандартный» интервал, используемый некоторыми структурами для их опроса? Предложения приветствуются. – UICodes

+0

Я думаю, что это будет зависеть именно от того, что вы пытаетесь сделать; ответа нет. Каким объектом вы являетесь опрос, как часто вы ожидаете его изменения, сколько других свойств определено на нем, чтобы пройти? Хотя вы могли бы уйти с очень маленьким интервалом, например, 50 мс в современном настольном браузере, для хорошо заполненного объекта в слабом браузере, таком как IEMobile6, который мог бы поставить его на колени! Кстати, для объектов хоста, таких как «навигатор», нет никакой гарантии, что установка каких-либо новых свойств или использование 'for ... in' для перебора по ним будут работать! : -S – bobince

+0

вы уже не можете зафиксировать изменения свойств на многих размещенных объектах (например, попытайтесь определить геттер/параметр для различных свойств объекта DOM), поэтому я не вижу проблемы, заключающейся в том, что предоставление общего уведомления об изменении объекта причина. – Michael

1

ES6 вводит понятие Proxies: es6 proxies on MDN.

Вот простой пример:

let objectToSpy = {}; 
let handler = { 
    set: (target, prop, value)=>{ 
     console.log('new prop:', prop); 
     target[prop] = value; 
    } 
}; 

let proxy = new Proxy(objectToSpy,handler); 
proxy.testProp = 'bla'; //prints: "new prop: testProp" 
+0

Это будет регистрироваться при каждом изменении свойства, но добавление дополнительного оператора if выполнит эту работу. [Fiddle] (https://jsfiddle.net/apt1e1a9/4/) Спасибо – dwonisch

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