出于安全考虑,我需要一个"镜像"宾语。即,如果我创建对象A,并浅层克隆A的副本并将其称为B,则只要A的属性发生更改,我希望B自动更新以反映更改,但不是相反。换句话说,单向属性同步。
我的问题:我是否已经在野外找到了一个我不知道的解决方案?
考虑用observe-js(https://github.com/polymer/observe-js)实现一个库,但我想在继续之前我应该四处询问。感谢。
答案 0 :(得分:1)
假设您不需要支持IE8及更早版本,您可以使用getter在现代浏览器上执行此操作。
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"
答案 1 :(得分: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