Показать сообщение отдельно
  #2 (permalink)  
Старый 11.09.2014, 05:33
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,589

Мб забиндить? Не знаю правда как в этом случае с оптимизацией... Вся надежда на браузер.)

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.
Вообще прокси крутая штука, которая может гораздо больше чем я привёл в пример.)
__________________
29375, 35

Последний раз редактировалось Aetae, 11.09.2014 в 06:01.
Ответить с цитированием