Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.09.2014, 03:51
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Одна функция в роли сеттера (геттера) для разных свойств
Можно ли сделать одну функцию геттером либо сеттером для разных элементов так, чтобы в момент вызова знать, для какого свойства объекта она была вызвана?

Поясню, в чём суть: имеется несколько разных свойств у одного объекта, геттер которых должен просто возвращать значение, и больше ничего (а вот сеттер уже делает разные интересные вещи). Хочется не писать для каждого из этих свойств свою функцию-геттер, а сделать одну общую и вызывать каждый раз её.

obj= {
    get a() {
        return this._a
    },
    set a(v) {
        // do smth interesting
    },
    get b() {
        return this._b;
    },
    set b(v) {
        // do smth else
    },
    get c() {
        return this._c
    },
    set c(v) {
        // i don't know what to do :-)
    }
}


Хочется это сократить.
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #2 (permalink)  
Старый 11.09.2014, 05:33
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,584

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

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.
Ответить с цитированием
  #3 (permalink)  
Старый 11.09.2014, 12:23
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,138

Не совсем понятное объяснение ((
т.е. у объекта есть свойства у которых есть функции
и проблема в том что для каждого свойства есть приходится писать однотипную функцию?

тогда почему не использовать наследование?
<!Doctype html>
<html><head><style></style></head><body>
<a id="fr"></a>
<script type='text/javascript'>
	obj_A ={
		set:function set (){ return "seter val = " + this.val },
		get:function get (){ return "seter val = " + this.val },
	}
	obj_B = function ff (){ this.val = "ничегошеньки в val нетути" }
	obj_B.prototype = obj_A;
	var obj = {};

	obj.a = new obj_B;
	obj.b = new obj_B;
	obj.c = new obj_B;
	obj.d = new obj_B;
	
	obj.a.val = "im A";
	obj.b.val = "im B";
	obj.c.val = "im C";
	
	document.all["fr"].innerHTML = ""+ 
		 obj.a.get() +"<br>"+
		 obj.b.get() +"<br>"+
		 obj.c.get() +"<br>"+
		 obj.d.get();
</script></body></html>

Последний раз редактировалось MallSerg, 11.09.2014 в 13:09.
Ответить с цитированием
  #4 (permalink)  
Старый 11.09.2014, 14:01
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Aetae, круто, про вот не знал про bind, позор на мою голову. Proxy -- и правда красивое решение, но у меня сразу даже пример ваш не получилось запустить

По-хорошему, надо попробовать оба варианта и проверить на производительность, ибо у меня она как раз важна, так как рисуется графика.

MallSerg, суть именно в геттерах и сеттерах. В том, что потом функция будет вызываться, когда ты просто делаешь obj.a=0
Вот, почитай.
http://habrahabr.ru/post/66242/
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #5 (permalink)  
Старый 11.09.2014, 16:25
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,584

Имхо если производительность сильно критична, то стоит забыть о вызовах функций на каждый чих, и вообще смотреть в сторону всяких TypedArray. (Посоветовал бы asm.js, но в текущем его виде человеку им пользоваться невозможно )
__________________
29375, 35
Ответить с цитированием
  #6 (permalink)  
Старый 11.09.2014, 16:45
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Aetae, ещё не понял, насколько критична. Сначала допишу, затормозит -- буду оптимизировать) Преждевременно этим заниматься, как известно, грех.
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AJAX функция для новых html-элементов broadcast77 AJAX и COMET 25 03.03.2014 14:01
поиск классов внутри тега yozuul jQuery 24 14.06.2013 22:00
'click' для разных селекторов bannndi jQuery 4 03.06.2013 18:02
Одна функция для всех тегов по одному событию antsivash Общие вопросы Javascript 1 22.10.2012 00:18
Переодическое обновление значений для графика, функция для обновления значений yupa87 Общие вопросы Javascript 0 09.07.2009 14:48