24.10.2012, 20:54
|
Интересующийся
|
|
Регистрация: 25.06.2012
Сообщений: 24
|
|
Синхронизация со значением объекта
так не работает
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]);
можно ли упростить логику синхронизации со значением объекта?
|
|
24.10.2012, 21:17
|
Профессор
|
|
Регистрация: 31.05.2012
Сообщений: 396
|
|
Можно использовать аксессорные свойства объектов, правда, они не работают в 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]);
|
|
24.10.2012, 21:33
|
Интересующийся
|
|
Регистрация: 25.06.2012
Сообщений: 24
|
|
Спасибо, не знал об этом способе.
Правда, мне нужна возможность синхронизации с любым доступным объектом (его значением). А здесь строгая привязка к a[b]
Да и начальство требует IE8+
|
|
24.10.2012, 22:12
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
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_, 24.10.2012 в 22:26.
|
|
24.10.2012, 22:22
|
Профессор
|
|
Регистрация: 31.05.2012
Сообщений: 396
|
|
Сообщение от kaf
|
Спасибо, не знал об этом способе.
Правда, мне нужна возможность синхронизации с любым доступным объектом (его значением). А здесь строгая привязка к a[b]
|
Это не проблема. В качестве сеттера и геттера свойства можно использовать любые функции. Я привёл лишь пример использования геттера и сеттера.
Цитата:
|
Да и начальство требует IE8+
|
Только что прочитал, что в IE 8 аксессорные свойства можно создать для DOM объектов. window является таким объектом, но почему-то мой код в IE 8 не работает.
|
|
24.10.2012, 22:59
|
Интересующийся
|
|
Регистрация: 25.06.2012
Сообщений: 24
|
|
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]);
|
|
24.10.2012, 23:12
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
24.10.2012, 23:38
|
Профессор
|
|
Регистрация: 31.05.2012
Сообщений: 396
|
|
Сообщение от Дзен-трансгуманист
|
Ну это вряд ли...
alert(window instanceof Node); // false
Так-то корнем является document, так что разве что через него, и потом, опционально, через with. Но это не наилучшая идея, имхо.
|
Да нет, в IE 8 в window тоже можно добавлять аксесорные свойства.
Оказывается, дело было в 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]);
Последний раз редактировалось oneguy, 24.10.2012 в 23:49.
|
|
24.10.2012, 23:40
|
Интересующийся
|
|
Регистрация: 25.06.2012
Сообщений: 24
|
|
nerv_ Нет. Мне нужен механизм для доступа к актуальным значениям "подписанных элементов", чтобы, например, по таймеру или по команде извне выполнять определенные действия с учетом текущих значений.
Последний раз редактировалось kaf, 24.10.2012 в 23:46.
|
|
24.10.2012, 23:47
|
Профессор
|
|
Регистрация: 31.05.2012
Сообщений: 396
|
|
Сообщение от kaf
|
nerv_, oneguy Предполагается создать контейнер (массив d для примера), в который можно "подписать" на определенное действие любые "элементы" любых объектов по ссылке.
|
В текущих браузерах это реализуется легко и удобно с помощью геттеров/сеттеров похоже тем примерам, которые я писал, а в IE 8 это сделать, по-видимому, невозможно, так как там в нативные объекты нельзя добавить аксессорные свойства.
Последний раз редактировалось oneguy, 24.10.2012 в 23:52.
|
|
|
|