Мб забиндить? Не знаю правда как в этом случае с оптимизацией... Вся надежда на браузер.)
var obj = {},
props = {
"a": 1,
"b": 1,
"c": 1,
};
function setGet(isSet, prop, val){
if(isSet){
console.log('set ' + prop + ' = ' + val);
return props[prop] = val;
}else{
console.log('get ' + prop + ' = ' + props[prop]);
return props[prop]
}
};
for(var prop in props) if(props.hasOwnProperty(prop)){
Object.defineProperty(obj, prop, {
set: setGet.bind(obj, true, prop),
get: setGet.bind(obj, false, prop),
enumerable : true,
configurable : true
});
}
var x = obj.b;
obj.b = x + 10;
В ES6 есть какраз подходящая для этого няшная штука, Proxy:
var props = {
"a": 1,
"b": 1,
"c": 1,
};
function setGet(obj, prop, val, proxy){
var isSet = !!proxy; //при get приходит только три аргумента, где третий proxy
if(isSet){
console.log('set ' + prop + ' = ' + val);
return obj[prop] = val;
}else{
console.log('get ' + prop + ' = ' + obj[prop]);
return obj[prop]
}
};
var obj = new Proxy(props, {
get: setGet,
set: setGet
});
var x = obj.b;
obj.b = x + 10;
Но увы без дополнительной настройки пока работать будет только в FF.
Вообще прокси крутая штука, которая может гораздо больше чем я привёл в пример.)