引子
弱鸡刷scriptoj的时候,看到这么一道单例试题:
1 | 单例模式(Singleton)是一种常用的软件设计模式,它保证我们系统中的某一个类在任何情况实例化的时候都获得同一个实例。例如: |
我就稀里糊涂的写了这么个答案,居然通过了!!!
1 | const singletonify = (OriginalClass) => { |
但翻看答案的时候,发现考察的点确是Proxy
,这块的知识点没点上,那就看看MDN上是咋写的。
Proxy
Proxy,顾名思义是个代理,代理干啥呢,代理给target添加新的功能handler,又不用修改target本身。
按照阮一峰老师在ES6中的解释,proxy就相当于java web中的拦截器,在正式使用target之前赋予其一些handler的功能。
语法
1 | let p = new Proxy(target, handler); |
参数
- target
用Proxy包装的目标对象
(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)。 - handler
一个对象
,其属性是当执行一个操作时定义代理的行为的函数。
看一下MDN上这个示例吧,扩展构造函数
1 | function extend(sup,base) { |
好多不太熟悉的函数😓,我们来了解一下吧
- Object.getOwnPropertyDescriptor
返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)属性描述符是一个类似这样的对象:
1 | { |
Object.create()
创建一个新对象,使用现有的对象来提供新创建的对象的protoObject.defineProperty
会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
说实话,为什么要这么搞,还是不太懂。。。(继续学习啊)
所以,用proxy来实现单例吧
1 | const singletonify = (OriginalClass) => { |