/** * ES6 * 代理通常可以修改某些操作的默认行为,这样我们就可以在访问默认对象之前做一层拦截 * 通过代理通常可以监听一个对象的属性变化 */ export class ProxyExample { execute() { class B { hp: number = 10; mp: number = 100; } let target = {}; let handler = { get: (target: any, p: PropertyKey, receiver: any) => { if (p === "toString") { return '[TAEGET-toString:]' + target.toString(); } else { return target[p]; } }, set: (target: any, p: PropertyKey, value: any, receiver: any) => { try { let oldValue = target[p]; if (oldValue !== value) { console.log(`值从${oldValue},变成:${value}`); target[p] = value; } } catch{ } return true; } }; let _b = new B(); let p = new Proxy(target, handler); // p.o = new B(); // p.o = 1; // p.o = 1; // p.o = true; // p.o = true; // p.o = _b; // p.o = _b; // console.log(p.toString); // var object: any = { proxy: new Proxy(target, handler) }; let obj = Object.create(p); obj.o = new B(); obj.o = 1; obj.o = 1; obj.o = true; obj.o = true; obj.o = _b; obj.o = _b; console.log(obj.toString); //-----------用于判断拦截某个属性的读取操作-----------------// let proxy = new Proxy(_b, { get: function (target, p: PropertyKey) { if (p in target) { return target[p]; } else { throw new ReferenceError(`属性:${p}不存在!!`); } } }); // proxy['height']; // Proxying a function object let target1 = function () { return 'I am the target'; }; let handler1 = { apply: (receiver, ...args) => { return 'I am the proxy'; } }; let p1 = new Proxy(target1, handler1); p1() === 'I am the proxy'; } }