总述
ES6 原生提供 Proxy 构造函数,用来生成 Proxy 实例。
var proxy = new Proxy(target, handler);
Proxy 对象的所有用法,都是上面这种形式,不同的只是handler参数的写法。其中,new Proxy()表示生成一个Proxy实例,target参数表示所要拦截的目标对象,handler参数也是一个对象,用来定制拦截行为。
code
handler中的construct方法解释:
construct(target, args):拦截 Proxy 实例作为构造函数调用的操作,比如new proxy(...args)。
可以得到这么个知识点:new Proxy(target, handler)
中 拦截操作中的target
和 new Proxy(target, handler)
中的target是相等的
function single(className) {
let instance = null;
return new Proxy(className, {
// construct(target, args):拦截 Proxy 实例作为构造函数调用的操作,比如new proxy(...args)。
construct (target,args) {
console.log(target,'1')
console.log(target === className, 'new Proxy的第一个参数和handler里面的第一个参数是什么关系')
class ProxyClass {
constructor () {
console.log(target,'2')
if(!instance) {
instance = new target(...args)
// 销毁单例
target.prototype.destroyed = function () {
instance= null
}
}
return instance
}
}
return new ProxyClass()
}
})
}
上述函数其实是利用了闭包,实现单例,instance其实一直存在。
class A {
constructor () {
}
run () {
console.log(1)
}
}
let AP = single(A)
let ap1 = new AP()
let ap2 = new AP()
// [class A] 1
// true target是个啥
// [class A] 2
// [class A] 1
// true target是个啥
// [class A] 2
console.log(ap1 === ap2) // true
上述方法不可以作为一个工厂函数批量生成各个类的单例