Open pzli opened 4 years ago
节流 handler.apply
const proxy = (func, time) => { let previous = new Date(0).getTime(); let handler = { apply(target, context, args){ let now = new Date().getTime() if(now - previous > time) { previous = now; Reflect.apply(func, context, args) } } } return new Proxy(func, handler) } const f = ()=>{console.log(new Date().getSeconds())} const f1 = proxy(f, 2000) setInterval(() => { f1() }, 1000);
单例 handler.contruct
const proxy = (func, time) => { let instance let handler = { construct(target, args){ if(!instance) { instance = Reflect.construct(func, args); } return instance } } return new Proxy(func, handler) } function Person(name, age) { this.name = name; this.age = age; } const SingletonPerson = proxy(Person) const p1 = new SingletonPerson('p1', 10) const p2 = new SingletonPerson('p2', 20) console.log(p1) console.log(p2) console.log(p1 === p2)
监听对象内部属性set(多层级递归)handler.defineProperty handler.get
const proxy = (obj, callback) => { let handler = { get(target, key){ try { return new Proxy(target[key], handler); }catch(e) { return Reflect.get(target, key); } }, defineProperty(target, key, descriptor) { callback(); return Reflect.defineProperty(target, key, descriptor) } } return new Proxy(obj, handler) } let obj = proxy({}, () => console.log('oops')); obj.a = {} obj.a.b = 'a'
这样就实现了无论对象嵌套多少层,只要有属性进行赋值就会触发get方法,对这层对象进行代理,随后触发defineProperty执行callback回调函数
节流 handler.apply
单例 handler.contruct
监听对象内部属性set(多层级递归)handler.defineProperty handler.get
这样就实现了无论对象嵌套多少层,只要有属性进行赋值就会触发get方法,对这层对象进行代理,随后触发defineProperty执行callback回调函数