0
点赞
收藏
分享

微信扫一扫

Proxy实现单例


总述

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)中 拦截操作中的targetnew 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

上述方法不可以作为一个工厂函数批量生成各个类的单例


举报

相关推荐

0 条评论