Синхронизация со значением объекта
так не работает
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, время: 23:01. |