Зеркальное отображение объектов JavaScript / Односторонняя синхронизация свойств
В целях безопасности мне нужен "зеркальный" объект. т. е. если я создаю объект A и мелко клонирую копию A и называю его B, при каждом изменении свойства A я надеюсь, что B автоматически обновит себя, чтобы отразить изменения, но не наоборот. Другими словами, односторонняя синхронизация свойств.
Мой вопрос: есть ли уже решение в дикой природе, о котором я не знаю?
Думал о внедрении библиотеки с наблюдением-js ( https://github.com/polymer/observe-js), но подумал, что мне следует поинтересоваться, прежде чем продолжить. Благодарю.
2 ответа
Предполагая, что вам не нужно поддерживать 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"
Вы можете настроить цепочку прототипов для этого:
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