2013-04-08 4 views
2

Скажем, у меня есть объект, подобный следующему:Отслеживать изменения на свойства объекта

Cars = { 
    "car_one": { 
     data: { 
      make: "Ford", 
      model: "Festiva" 
     }, 
     img: "car_one.jpg" 
    }, 
    "car_two": { 
     data: { 
      make: "Chevy", 
      model: "Pinto", 
      color: "Green" 
     }, 
     img: "car_two.jpg" 
    } 
    ...and so on... 
} 

Я надеялся найти способ контролировать только свойство data (и все вложенные свойства) для изменений, то будет способный настроить функцию для запуска.

Я искал Object.watch(), но тестирование, похоже, показывает, что мне нужно будет настроить его вручную, чтобы проверить каждое свойство Cars.{some_car}.data, которое (как показано в моем примере) не является постоянным. Наверное, я надеюсь, что есть менее сложный метод, о котором я просто не знаю.

+0

Если вы используете браузер на основе Gecko, вы можете использовать [getters and setters] (https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Working_with_Objects?redirectlocale=en-US&redirectslug=Core_JavaScript_1 .5_Guide% 2FWorking_with_Objects # Defining_getters_and_setters). Однако они не являются частью ECMAScript и поддерживаются примерно половиной (полной догадки) используемых браузеров. – RobG

+0

Когда-нибудь вы сможете использовать 'Proxy'. Он входит в ECMAScript 6. В Firefox есть текущая реализация, но поскольку стандарт не завершен, я не знаю, насколько он уступчив. Я думаю, что Chrome имеет это, если вы включите его экспериментальные функции JavaScript. – 2013-04-08 01:12:21

+2

@RobG: Вы имеете в виду устаревший синтаксис '__defineGetter__'? ECMAScript 5 получает и устанавливает поведение для свойств, просто используя другой синтаксис. – 2013-04-08 01:16:46

ответ

1

В зависимости от того, сколько у вас контроля над его вызовом, вы можете сделать функцию доступа. Функция может принимать объект в качестве аргумента и устанавливать этот объект в качестве текущего значения, если аргумент установлен. Для вашего использования здесь вы можете добавить триггер определенного типа. Если аргумент не передан, он возвращает текущее значение.

Это тип API, который использует knockout.

В современных браузерах getters and setters сделать это легко. Для более старых значений вы можете иметь свойство доступа, а затем другое свойство, которое служит держателем данных.

1

К сожалению, на сегодняшний день самым простым способом, вероятно, было бы перебрать свойства в data и вызвать Object.watch для каждого из них. Однако у нас может быть Object.observe на помощь в конце концов. Если вы ищете кросс-браузерный вариант Obect.watch, посмотрите here.

Другие альтернативы состоят в том, чтобы обернуть ваши данные в наблюдаемый объект, который позволяет модифицировать данные с помощью общего метода set, который мог бы срабатывать при изменении некоторых свойств или иметь какую-либо задачу контроля свойств, которая будет выполняться с определенным интервалом или вызвано конкретными действиями, которые проверяли бы объект на предмет изменений. Однако эти альтернативы не проще.

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