JavaScript对象镜像/单向属性同步

时间:2014-10-03 16:43:14

标签: javascript object.observe

出于安全考虑,我需要一个"镜像"宾语。即,如果我创建对象A,并浅层克隆A的副本并将其称为B,则只要A的属性发生更改,我希望B自动更新以反映更改,但不是相反。换句话说,单向属性同步。

我的问题:我是否已经在野外找到了一个我不知道的解决方案?

考虑用observe-js(https://github.com/polymer/observe-js)实现一个库,但我想在继续之前我应该​​四处询问。感谢。

2 个答案:

答案 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