bf57c773ad08685af2bdd447601b779568febc4d.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. System.register(["cc"], function (_export, _context) {
  2. "use strict";
  3. var _cclegacy, JsonOb, _crd, OP, types, OAM;
  4. _export("JsonOb", void 0);
  5. return {
  6. setters: [function (_cc) {
  7. _cclegacy = _cc.cclegacy;
  8. }],
  9. execute: function () {
  10. _crd = true;
  11. _cclegacy._RF.push({}, "000b00Lx19Ke4hAFc9/Qlnh", "JsonOb", undefined);
  12. /*
  13. * @Author: dgflash
  14. * @Date: 2022-09-01 18:00:28
  15. * @LastEditors: dgflash
  16. * @LastEditTime: 2022-09-06 17:18:05
  17. */
  18. /**
  19. * 实现动态绑定的核心部分,
  20. * 每次修改属性值,都会调用对应函数,并且获取值的路径
  21. */
  22. OP = Object.prototype;
  23. types = {
  24. obj: '[object Object]',
  25. array: '[object Array]'
  26. };
  27. OAM = ['push', 'pop', 'shift', 'unshift', 'sort', 'reverse', 'splice'];
  28. /**
  29. * 实现属性拦截的类
  30. */
  31. _export("JsonOb", JsonOb = class JsonOb {
  32. constructor(obj, callback) {
  33. this._callback = void 0;
  34. if (OP.toString.call(obj) !== types.obj && OP.toString.call(obj) !== types.array) {
  35. console.error('请传入一个对象或数组');
  36. }
  37. this._callback = callback;
  38. this.observe(obj);
  39. }
  40. /**对象属性劫持 */
  41. observe(obj, path) {
  42. if (OP.toString.call(obj) === types.array) {
  43. this.overrideArrayProto(obj, path);
  44. } // @ts-ignore 注:避免API生成工具报错
  45. Object.keys(obj).forEach(key => {
  46. var self = this; // @ts-ignore
  47. var oldVal = obj[key];
  48. var pathArray = path && path.slice();
  49. if (pathArray) {
  50. pathArray.push(key);
  51. } else {
  52. pathArray = [key];
  53. }
  54. Object.defineProperty(obj, key, {
  55. get: function get() {
  56. return oldVal;
  57. },
  58. set: function set(newVal) {
  59. //cc.log(newVal);
  60. if (oldVal !== newVal) {
  61. if (OP.toString.call(newVal) === '[object Object]') {
  62. self.observe(newVal, pathArray);
  63. }
  64. var ov = oldVal;
  65. oldVal = newVal;
  66. self._callback(newVal, ov, pathArray);
  67. }
  68. }
  69. }); // @ts-ignore
  70. if (OP.toString.call(obj[key]) === types.obj || OP.toString.call(obj[key]) === types.array) {
  71. // @ts-ignore
  72. this.observe(obj[key], pathArray);
  73. }
  74. }, this);
  75. }
  76. /**
  77. * 对数组类型进行动态绑定
  78. * @param array
  79. * @param path
  80. */
  81. overrideArrayProto(array, path) {
  82. // 保存原始 Array 原型
  83. var originalProto = Array.prototype; // 通过 Object.create 方法创建一个对象,该对象的原型是Array.prototype
  84. var overrideProto = Object.create(Array.prototype);
  85. var self = this;
  86. var result; // 遍历要重写的数组方法
  87. OAM.forEach(method => {
  88. Object.defineProperty(overrideProto, method, {
  89. value: function value() {
  90. var oldVal = this.slice(); //调用原始原型上的方法
  91. result = originalProto[method].apply(this, arguments); //继续监听新数组
  92. self.observe(this, path);
  93. self._callback(this, oldVal, path);
  94. return result;
  95. }
  96. });
  97. }); // 最后 让该数组实例的 __proto__ 属性指向 假的原型 overrideProto
  98. array['__proto__'] = overrideProto;
  99. }
  100. });
  101. _cclegacy._RF.pop();
  102. _crd = false;
  103. }
  104. };
  105. });
  106. //# sourceMappingURL=bf57c773ad08685af2bdd447601b779568febc4d.js.map