Зеркальное отображение объектов JavaScript / Односторонняя синхронизация свойств

javascript object.observe

167 просмотра

2 ответа

В целях безопасности мне нужен «зеркальный» объект. т. е. если я создаю объект A и мелко клонирую копию A и называю его B, при каждом изменении свойства A я надеюсь, что B автоматически обновит себя, чтобы отразить изменения, но не наоборот. Другими словами, односторонняя синхронизация свойств.

Мой вопрос: есть ли уже решение в дикой природе, о котором я не знаю?

Думал о внедрении библиотеки с наблюдением-js ( https://github.com/polymer/observe-js ), но подумал, что я должен спросить, прежде чем продолжить. Благодарю.

Автор: settinghead Источник Размещён: 13.11.2019 11:34

Ответы (2)


1 плюс

Решение

Предполагая, что вам не нужно поддерживать IE8 и более ранние версии, вы можете использовать геттеры для этого в современных браузерах.

function proxy(src) {
  var p = {};
  Object.keys(src).forEach(function(key) {
    Object.defineProperty(p, key, {
      get: function() {
        return src[key];
      }
    });
  });
  return p;
}

var a = {
  foo: "Original foo",
  bar: "Original bar"
};
var b = proxy(a);

console.log(b.foo);    // "Original foo"
a.foo = "Updated foo"; // Note we're writing to a, not b
console.log(b.foo);    // "Updated foo"
Автор: T.J. Crowder Размещён: 03.10.2014 04:46

0 плюса

Вы можете настроить цепочку прототипов для этого:

var a = {};
var Syncer = function(){};
Syncer.prototype = a;
var b = new Syncer();

a.foo = 123;
b.foo; // 123

b.bar = 456;
a.bar // undefined

Любое свойство, не установленное bнепосредственно, будет искать объект-прототип, то есть a.

Вы можете даже обернуть это в удобную функцию:

var follow = function(source) {
  var Follower = function(){};
  Follower.prototype = source;
  return new Follower();
}

var a = {};
var b = follow(a);

a.foo = 123;
b.bar = 456;

a.foo; // 123
b.foo; // 123

a.bar; // undefined
b.bar; // 456
Автор: Alex Wayne Размещён: 03.10.2014 04:59
Вопросы из категории :
32x32