Observe.js 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. var obsCbs = obsCbs || [];
  2. var obsObjs = obsObjs || [];
  3. var cloneObjs = cloneObjs || [];
  4. function newOne(obj) {
  5. obsObjs.push(obj);
  6. obsCbs.push([]);
  7. cloneObjs.push(Object.assign({}, obj));
  8. }
  9. module.exports = {
  10. del(obj, cb) {
  11. let curObjIdx = obsObjs.indexOf(obj);
  12. if (~curObjIdx) {
  13. let cbs = obsCbs[curObjIdx];
  14. let curCbIdx = cbs.indexOf(cb);
  15. if (~curCbIdx) {
  16. cbs.splice(curCbIdx, 1);
  17. if (!cbs.length) {
  18. obsObjs.splice(curObjIdx, 1);
  19. }
  20. }
  21. }
  22. },
  23. add(obj, cb) {
  24. let curIdx = obsObjs.indexOf(obj);
  25. if (!~curIdx) {
  26. curIdx = obsObjs.length;
  27. newOne(obj);
  28. }
  29. let cbs = obsCbs[curIdx];
  30. cbs.push(cb);
  31. for (let key in obj) {
  32. Object.defineProperty(obj, key, {
  33. set: function (val) {
  34. cloneObjs[curIdx][key] = val;
  35. for (let i = 0; i < cbs.length; i++) {
  36. cbs[i].apply(obj, [val, key]);
  37. }
  38. },
  39. get: function () {
  40. return cloneObjs[curIdx][key];
  41. }
  42. });
  43. }
  44. return obj;
  45. }
  46. };