JavaScript Object Mirroring/One-way Property Syncing

后端 未结 2 593
无人及你
无人及你 2021-01-28 01:58

For security purposes, I have a need for a \"mirrored\" object. i.e. if I create object A, and shallow-clone a copy of A and call it B, whenever a property of A changes, I hope

相关标签:
2条回答
  • Assuming you don't need to support IE8 and earlier, you can use getters to do that on modern browsers.

    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"
    
    0 讨论(0)
  • 2021-01-28 02:46

    You can setup the prototype chain for this:

    var a = {};
    var Syncer = function(){};
    Syncer.prototype = a;
    var b = new Syncer();
    
    a.foo = 123;
    b.foo; // 123
    
    b.bar = 456;
    a.bar // undefined
    

    Any property not set on b directly will be looked for on the prototype object, which is a.

    You can even wrap this up in a convenience function:

    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
    
    0 讨论(0)
提交回复
热议问题