var obsCbs = obsCbs || []; var obsObjs = obsObjs || []; var cloneObjs = cloneObjs || []; function newOne(obj) { obsObjs.push(obj); obsCbs.push([]); cloneObjs.push(Object.assign({}, obj)); } module.exports = { del(obj, cb) { let curObjIdx = obsObjs.indexOf(obj); if (~curObjIdx) { let cbs = obsCbs[curObjIdx]; let curCbIdx = cbs.indexOf(cb); if (~curCbIdx) { cbs.splice(curCbIdx, 1); if (!cbs.length) { obsObjs.splice(curObjIdx, 1); } } } }, add(obj, cb) { let curIdx = obsObjs.indexOf(obj); if (!~curIdx) { curIdx = obsObjs.length; newOne(obj); } let cbs = obsCbs[curIdx]; cbs.push(cb); for (let key in obj) { Object.defineProperty(obj, key, { set: function (val) { cloneObjs[curIdx][key] = val; for (let i = 0; i < cbs.length; i++) { cbs[i].apply(obj, [val, key]); } }, get: function () { return cloneObjs[curIdx][key]; } }); } return obj; } };