Синхронизация со значением объекта
так не работает
var a={},b; a[b]=0; var c=a[b]; c++; alert(a[b]); так работает var a={},b; a[b]=0; var c=[a,b]; c[0][c[1]]++; alert(a[b]); можно ли упростить логику синхронизации со значением объекта? |
Можно использовать аксессорные свойства объектов, правда, они не работают в IE<9.
var a={}, b; a[b]=0; Object.defineProperty(window, "c", { get: function () { return a[b]; }, set: function (v) { a[b]=v; }, enumerable: true }); c++; alert(a[b]); |
Спасибо, не знал об этом способе.
Правда, мне нужна возможность синхронизации с любым доступным объектом (его значением). А здесь строгая привязка к a[b] Да и начальство требует IE8+ |
var a={}, b = 'b'; a[b]=0; a[b]++; alert(a[b]); сразу не въехал, что нужно var a = {}; var c = {}; var b; a[ b ] = 0; c[ b ] = a[ b ]; alert( c[ b ] ); только я не понимаю зачем это, если в большинстве случаев достаточно var a = {}; var c = a; var b; a[ b ] = 0; alert( c[ b ] ); |
Цитата:
Цитата:
|
nerv_, oneguy Предполагается создать контейнер (массив d для примера), в который можно "подписать" на определенное действие любые "элементы" любых объектов по ссылке.
var a={},b,a1={},b1; a[b]=0;a1[b1]=1; var d=[]; d.push([a,b]);d.push([a1,b1]); for(var i=0;i<d.length;i++){ d[i][0][d[i][1]]++; // или еще что-то } alert(a[b]+', '+a1[b1]); |
это?
|
Цитата:
Оказывается, дело было в enumerable: true, если это убрать, то в IE 8 работает (в этом нет ошибки согласно спецификации, просто Object.defineProperty в IE 8 реализован нестандартным способом). Этот пример работает также в IE 8. var a={}, b; a[b]=0; Object.defineProperty(window, "c", { get: function () { return a[b]; }, set: function (v) { a[b]=v; } }); c++; alert(a[b]); |
nerv_ Нет. Мне нужен механизм для доступа к актуальным значениям "подписанных элементов", чтобы, например, по таймеру или по команде извне выполнять определенные действия с учетом текущих значений.
|
Цитата:
|
oneguy Спасибо. Хотя сейчас и нужна поддержка IE8, со временем эта необходимость может отпасть, т.ч. буду иметь в виду...
|
Цитата:
var a={},b,a1={},b1; a[b]=0;a1[b1]=1; Object.defineProperty(window, "d0", { get: function () { return a[b]; }, set: function (v) { a[b]=v; } }); Object.defineProperty(window, "d1", { get: function () { return a1[b1]; }, set: function (v) { a1[b1]=v; } }); for(var i=0;i<2;i++){ window["d"+i]++; // или еще что-то } alert(a[b]+', '+a1[b1]); |
oneguy Много глобальных переменных, мне кажется, не есть хорошо. Чуть подправил, получилась основа нужного мне механизма.
function F(){ this.counter=0; var self=this; this.bind=bind; function bind(a,b){ var link='link_'+self.counter; Object.defineProperty(window, link, { get: function () { return a[b]; }, set: function (v) { a[b]=v; } }); self.counter++; return link; } } var f=new F(); var d=[]; var a={},b; a[b]=0; d.push(f.bind(a,b)); var a1={},b1; a1[b1]=1; d.push(f.bind(a1,b1)); for(var i=0;i<d.length;i++){ window[d[i]]++; // или еще что-то } alert(a[b]+', '+a1[b1]); |
Часовой пояс GMT +3, время: 17:28. |