0

出于安全目的,我需要一个“镜像”对象。即,如果我创建对象 A,并浅克隆 A 的副本并将其称为 B,则每当 A 的属性发生更改时,我希望 B 自动更新自身以反映更改,而不是相反。换句话说,单向属性同步。

我的问题:在野外是否已经有我不知道的解决方案?

正在考虑使用observe-js(https://github.com/polymer/observe-js)实现一个库,但我认为我应该在继续之前询问一下。谢谢。

4

2 回答 2

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"
于 2014-10-03T16:46:51.097 回答
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
于 2014-10-03T16:59:46.853 回答