Utilizing ES6 Proxy we can observe a change in object or do some validation before setting an value.
The ES6 Proxy constructor will accept the source object and an interceptor/handler. An interceptor can be a object with a functions which define the operation.
const obj = {};
const handler = {
  set(target, key, value) {
    console.log(`Setting value ${key} as ${value}`)
    target[key] = value;
  },
};
const p = new Proxy(obj, handler);
p.a = 10; // logs "Setting value a as 10"
p.c = 20; // logs "Setting value c as 20"
console.log(p.a); // logs 10
The above snippet is an example for how we can observe a change on obj when a value is set or changed.
Similar way we can observe when we try to read any value from the object by defining a get method on handler.
const obj = {a: 10, c: 20};
const handler = {
  get(target, key) {
    console.log(`Reading value from ${key}`)
    return target[key];
  },
};
const p = new Proxy(obj, handler);
console.log(p.a); // logs "Reading value from a" and "10"
Now to observe deleting a key we can define deleteProperty on handler.
const obj = {a: 10, c: 20};
const handler = {
  deleteProperty(target, key) {
    console.log(`Deleting ${key}`)
    delete target[key];
  },
};
const p = new Proxy(obj, handler);
delete p.a; // logs "Deleting a"
You can find a working sample on jsbin. This is just a basics of Proxy. you can look into more ways to observe on Proxy on MDN