Доброго времени суток, %username%!
Итак, JavaScript. У нас имеется объект (с методами загрузки/сохранения) для хранения настроек приложения (в localstorage), и объект этот выглядит так:
var SettingsStorage = {
data: {
some_value1: null,
child_object: {
some_value2: true,
some_value3: 1000
},
some_value4: null
},
load: function(callback) {
// load this.data from localstorage
},
save: function(callback) {
// save this.data to localstorage
}
};
И имеется прокси-объект для доступа к данным настроек вида:
var Settings = new Proxy(SettingsStorage.data, {
set: function(obj, prop, value) {
var storage_data = SettingsStorage.data;
if (obj === storage_data && prop === 'some_value1') {
console.log('Да да! Мы поймали момент изменения SettingsStorage.data.some_value1!');
}
obj[prop] = value;
return true;
}
});
И теперь при изменении Settings.some_value1 мы изменяем SettingsStorage.data.some_value1 и можем выполнить произвольный код в момент изменения (например - сохранить изменения, что избавит нас от принудительного вызова SettingsStorage.save()).
И всё бы ничего, если бы не необходимость перехватить момент изменения SettingsStorage.data.child_object.some_value2 - с дочерними объектами этот финт не прокатывает. Как это сделать?
ps. Данный подход необходим для того, что-бы при изменении каких-либо важных настроек приложения изменить его поведение в целом. Другими словами нужно отловить изменения свойств объекта, без написания отдельного объекта с тучей геттеров/сеттеров + переписывать уже созданный апи. Браузер - Google Chrome.