缘起


今天是鬼节,小编心血来潮,觉得应该更新文章了!于是应广大童鞋们要求,今天来聊聊proxy手写思路。看了这篇文章后,你会思如泉涌,会迫不及待的想试一试!本篇文章只是思路和少量代码,具体实践,有兴趣的童鞋可以去试试!篇末尾再给大家一个火影的彩蛋(bug),哈哈哈,进入正题!

如何入手


大家按照proxy定义,可能最多只是认为,proxy是一个代理,一个对象,剩下的无从下手是吗!本文通过以下几个方面来解析:

  • proxy主题
  • proxy内部方法和函数等

proxy主体


我们先来看proxy语法

const p = new Proxy(target, handler)

上面那个new关键词,你会想到啥?没错,就是构造函数,当然也可以是class,本质上还是语法糖,哈哈哈!

不罗嗦了,上代码:

function Proxy1 (target, handler) {const _target = JSON.parse(JSON.stringify(target))return _target
}

看了以上代码,是不是感觉主体很简单,下面我们看proxy内部方法和函数等。

proxy内部方法和函数等


先来看看简单的set和get方法

function Proxy1 (target, handler) {const _target = JSON.parse(JSON.stringify(target))for (let key in _target ) {Object.defineProperty(_target , key, {get: function() {handler.get && handler.get(target, key)},set: function(value) {handler.set && handler.set(target, key, value)},})}return _target
}

是不是很容易,接着我们来看看apply

function Proxy1 (target, handler) {let applyFunc = (target,  handler) => (...args) => {return handler.apply && handler.apply(target, this, args )}const _target =typeof target === 'function' ? applyFunc(target, handler)  : JSON.parse(JSON.stringify(target))for (let key in _target ) {Object.defineProperty(_target , key, {get: function() {handler.get && handler.get(target, key)},set: function(value) {handler.set && handler.set(target, key, value)},})}return _target
}

是不是也很简单,同样道理,其他api也一样,当然上面的apply要兼容call,apply 等调用,所以还要做点兼容处理!

不足


这里其实没法拦截construct,小编曾经试图使用class处理,但是因为new后,this指向性的原因,会导致某些代码内置的方法反复调用,总之,没法完美的做到底层兼容,所以这个等以后小编找到方法,再补充吧!

尾声


美好的时间总是短暂的,大家看完这篇文章是不是豁然开朗!下面公布今天的彩蛋,火影的一个bug是只要对着宇智波的人使用幻术,受术者情绪激烈起伏,就可以白嫖万花筒了,哈哈哈哈,也就是说宇智波一族按照这个方式,不说人均万花筒,但是大多数万花筒还是可以的!
文章的最后,大家今天早点睡觉,保重身体啊,哈哈哈!

鬼节聊聊手写proxy思路相关推荐

  1. 手写一个动态代理实现,手写Proxy,手写ClassLoader,手写InvocationHandler

    整个过程中用到了手写类加载器, 手写动态生成java代码 手写编译代码 最后实现动态代理 手写Proxy示例代码: package com.example.demo.proxy.custom;impo ...

  2. Android手写笔应用的实现,android手写笔思路

    工作需要,对这方面做了一些了解 一般的手写对android canvas有点理解的应该都知道,只需要单纯的使用drawPath就可以在view上画画. 而手写笔的关键则是要让path的strokeWi ...

  3. android手写笔思路

    工作需要,对这方面做了一些了解 一般的手写对android canvas有点理解的应该都知道,只需要单纯的使用drawPath就可以在view上画画. 而手写笔的关键则是要让path的strokeWi ...

  4. 数字手写识别——Java实现KNN算法

    引言 手写识别也是当前机器学习的一大热点,数字手写识别是手写识别中的基础,我们用到的是knn算法,今天给大家讲一下我的实现方法: 环境 IDE:Eclipse 语言:Java 项目:数字手写识别 思路 ...

  5. 高仿真 JDK Proxy手写实现

    不仅知其然,还得知其所以然.既然 JDK Proxy功能如此强大,那么它是如何实现的呢?我们现在来探究一下原理,并模仿 JDK Proxy自己动手写一个属于自己的动态代理.我们都知道 JDK Prox ...

  6. 手写自定义注解实现思路

    我在这边问一下大家,你们说一下,我们现在想怎么样呢,这个时候大家记住一点,我们进入到正题,我们手写Spring的事务注解,在这边写一下,手写Spring的事务注解,既然手写的情况下,在这边我们假设,记 ...

  7. C语言手写SDS字符串的实现思路

    C语言手写SDS字符串的实现思路 Simple Dynamic Strings (简称 SDS) 是一个 C 语言封装的的字符串,它增强了 C 语言字符串处理的能力. SDS 的 C 语言实现通常包括 ...

  8. 大疆无人机开发:手写全景(思路 + 大疆的坑)

    大疆手写全景的三个思路: 1.采用missionTimeLine的方式实现. 2.采用航点的方式WayPoint实现. 3.采用虚拟摇杆的方式VirtualStick实现. 第一种方案: 其中最符合软 ...

  9. @cacheable 设置过期时间_缓存面试三连击——聊聊Redis过期策略?内存淘汰机制?再手写一个LRU 吧!...

    大家好,今天我和大家想聊一聊有关redis的过期策略的话题. 听到这里你也许会觉得:"我去,我只是个日常搬砖的,这种偏底层的知识点,我需要care吗?" 话虽如此·,但是兄die, ...

最新文章

  1. 基于python的分类预测_机器学习算法(五): 基于支持向量机的分类预测
  2. Github上AI在银行和保险的应用列表
  3. python程序设计基础实战教程_Python程序设计基础实战教程
  4. 策略设计模式_设计模式之策略者模式
  5. C++提高部分_C++普通函数与函数模板的区别---C++语言工作笔记084
  6. html转json有危险字符,javascript
  7. JMV监控工具之JConsole
  8. 形容谣言的四字词语_四字词语加解释大全
  9. python百分号用法_python中百分号表示什么意思
  10. map取固定key_Map获取key值
  11. 隔壁老王烙烧饼问题。
  12. switch调函数 vue_vue3中轻松实现switch功能组件的全过程
  13. Exchange邮箱的创建和配置
  14. 小闫陪你入门 Java (一)
  15. 微信小程序开发使用onreachBottom实现页面触底加载及分页
  16. 【每日一题】 959. 由斜杠划分区域
  17. java线程池的参数设置
  18. 原神如何修改服务器,原神PC端界面太大怎么修改 pc窗口界面调整方法分享[多图]...
  19. 态度决定一切细节决定成败_一切都在细节中
  20. 基于微信平台的学生信息管理系统

热门文章

  1. uniapp顶部安全距离(包括app)
  2. 排版字号对应多少pt
  3. python中divmod函数的用法
  4. CF 232 div1
  5. 编码以及Python中的编码
  6. (附源码)计算机毕业设计SSM流浪猫狗救助站
  7. 计算机毕设(附源码)JAVA-SSM流浪猫狗救助站
  8. Parvenir système gouvernement.Recusandae repellendus quidem assumenda.
  9. 牛客 明七暗七----数位dp
  10. 位运算符、|、~、^