如何使用ES7 Decorator给你的游戏人物开挂?

  1. // 预告: 本文有点小难度,对js不太熟的人可能比较懵逼
  2. // 本文的目的是让你们知其然
  3. // ==========================================
  4. // 今天我们来说一说 es7的 装饰者模式(Decorator)
  5. // 啥是装饰者模式,听着很高大上
  6. // 我不和你扯什么设计模式,元编程,我从一个游戏的例子给大家讲解
  7. // 装饰器就是给一个游戏玩家装饰上了一件牛逼的装备
  8. // ES7 如何使用Decorator强化你的装备
  9.  
  10. // 1. 一个普通的玩家类,具有攻击力和防御力两项属性
  11. class 玩家 {
  12. // 默认 1点攻击,1点防御
  13. constructor(攻击力 = 1, 防御力 = 1) {
  14. this.init(攻击力, 防御力)
  15. }
  16.  
  17. // 初始化攻击力 防御力
  18. init(攻击力, 防御力) {
  19. this.攻击力 = 攻击力
  20. this.防御力 = 防御力
  21. }
  22. print() {
  23. console.log(`玩家 ==> 攻击力:${this.攻击力}, 防御力:${this.防御力}`)
  24. }
  25. }
  26.  
  27. let player1 = new 玩家() // 创建一个玩家实例
  28. player1.print() // '玩家 ==> 攻击力:1, 防御力:1'
  29.  
  30. // 2. 这一步厉害了
  31. // 我们创建一个方天画戟的装饰器,一出生自动加100攻击力
  32. // 装饰器接受三个固定参数, (目标,属性,属性描述)
  33. function 方天画戟(target, prop, descriptor) {
  34. let func = descriptor.value // 获取目标的init方法
  35. descriptor.value = function() {
  36. // arguments[0]即第一个参数 => 攻击力
  37. arguments[0] += 100 // 攻击力+100
  38. return func.apply(target, arguments) // init(100, 1)
  39. }
  40. return descriptor // 知道为什么要返回它么
  41. }
  42.  
  43. // 升级版玩家,出生自带方天画戟
  44. class 玩家2 {
  45. constructor(攻击力 = 1, 防御力 = 1) {
  46. this.init(攻击力, 防御力)
  47. }
  48.  
  49. // 在init初始化方法上写上 '@装饰器名称' 就把外挂加上了
  50. // 另外装饰器是可以叠加的
  51. // @马云 艾特一下马云,让你更有钱
  52. // 这下子牛逼了
  53. @方天画戟
  54. init(攻击力, 防御力) {
  55. this.攻击力 = 攻击力
  56. this.防御力 = 防御力
  57. }
  58. print() {
  59. console.log(`玩家 ==> 攻击力:${this.攻击力}, 防御力:${this.防御力}`)
  60. }
  61. }
  62.  
  63. let player2 = new 玩家2() // 升级版玩家
  64. player2.print() // '玩家 ==> 攻击力:101, 防御力:1'
  65.  
  66. // 目前Decorator特性还没有任何浏览器支持
  67. // 本文的代码需要使用babel编译之后才会看到结果
  68.  
  69. // *题外话*,如果你想知道Decorator是干什么的,本文可以帮助您理解
  70. // 如果你想彻底搞懂Decorator,你还需要了解Object.defineProperty
  71. // Object.defineProperty很强大,前端同学常用的vue就是基于此做的数据响应式
  72. // 熟悉Java Python的同学对Decorator应该早已很熟悉了,强大的AOP,数据映射等等
  73.  
  74. // 本文完

转载:https://zhuanlan.zhihu.com/p/29712462

简单理解 ES7 Decorator(装饰器)的更多相关文章

  1. 装饰器模式&&ES7 Decorator 装饰器

    装饰器模式(Decorator Pattern)允许向一个现有的对象动态添加新的功能,同时又不改变其结构.相比JavaScript中通过鸡肋的继承来给对象增加功能来说,装饰器模式相比生成子类更为灵活. ...

  2. 谈谈Python中的decorator装饰器,如何更优雅的重用代码

    众所周知,Python本身有很多优雅的语法,让你能用一行代码写出其他语言很多行代码才能做的事情,比如: 最常用的迭代(eg: for i in range(1,10)), 列表生成式(eg: [ x* ...

  3. 简单理解Struts2中拦截器与过滤器的区别及执行顺序

    简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...

  4. 理解Python的装饰器

    看Flask文档时候看到关于cache的装饰器,有这么一段代码: def cached(timeout=5 * 60, key=’view/%s’): def decorator(f): @wraps ...

  5. Python的程序结构[8] -> 装饰器/Decorator -> 装饰器浅析

    装饰器 / Decorator 目录 关于闭包 装饰器的本质 语法糖 装饰器传入参数 1 关于闭包 / About Closure 装饰器其本质是一个闭包函数,为此首先理解闭包的含义. 闭包(Clos ...

  6. Python进阶之decorator装饰器

    decorator装饰器 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB&quo ...

  7. koa2使用es7 的装饰器decorator

    本文主要讲述我在做项目中使用装饰器(decorator)来动态加载koa-router的路由的一个基础架构. 目前JavaScript 对decorator 是不支持,但是可以用babel 来编译 既 ...

  8. Decorator装饰器模式个人理解

    对于装饰器模式,其主要是为了:在不改变本体特征的情况下,对其进行包装.装饰,目的是为了补充.扩展.增强其功能. 有三个原则: 不能改变本体的特征 要对本体的功能进行扩展 装饰器脱离了本体则没有任何含义 ...

  9. 项目解析1、登录验证用户是否存在 储备知识 Python 之 decorator装饰器

    下面是我对 装饰器 这一小节的总结, 以及自己的理解. 注:[本文中的代码参考上述教程] 很多时候我会把Python的很多语法与C++相融合,在C++中,函数的名称即为函数的地址,我们可以通过定义成为 ...

随机推荐

  1. Eclipse下创建Spring MVC web程序--非maven版

    首先, 安装eclipse和tomcat, 这里我下载的是tomcat9.0版本64位免安装的:地址https://tomcat.apache.org/download-90.cgi 免安装的如何启动 ...

  2. 服务器端查看图片库 eog

    eog 命令 eye of gnome,用来在服务器端查看图片. sudo apt-get install eog eog picname.jpg

  3. 九度oj 题目1452:搬寝室

    题目描述: 搬寝室是很累的,xhd深有体会.时间追述2006年7月9号,那天xhd迫于无奈要从27号楼搬到3号楼,因为10号要封楼了.看着寝室里的n件物品,xhd开始发呆,因为n是一个小于2000的整 ...

  4. Spring c3p0连接池通过Hibernate配置

    首先进行Hibernate配置,详见http://www.cnblogs.com/claricre/p/6509931.html 然后调用这三个包. 配置hibernate.cfg.xml文件: &l ...

  5. iOS学习笔记45-Swift(五)协议

    一.Swift协议 协议是为方法.属性等定义一套规范,没有具体的实现,类似于Java中的抽象接口,它只是描述了方法或属性的骨架,而不是实现.方法和属性实现还需要通过定义类,函数和枚举完成. 1. 协议 ...

  6. 使用ssh建立隧道和web代理

    动态端口转发(socket4/5代理): 通过ssh监听本地端口并把数据转发至远程动态端口 转发local port 至 ssh Server ssh -D ssh -qfTnN -D 本地目标端口 ...

  7. 周赛Problem 1021: 分蛋糕(埃拉托斯特尼筛法)

    Problem 1021: 分蛋糕 Time Limits:  1000 MS   Memory Limits:  65536 KB 64-bit interger IO format:  %lld  ...

  8. 洛谷P3327 [SDOI2015]约数个数和 【莫比乌斯反演】

    题目 设d(x)为x的约数个数,给定N.M,求\(\sum_{i = 1}^{N} \sum_{j = 1}^{M} d(ij)\) 输入格式 输入文件包含多组测试数据.第一行,一个整数T,表示测试数 ...

  9. 'Add Solution': A timeout has occurred while invoking commands in SharePoint host process.

    一.问题描述: 在部署SharePoint solution的时候,出现Time out 的问题,错误提示: Error occurred in deployment step 'Add Soluti ...

  10. LOJ#2302. 「NOI2017」整数

    $n \leq 1000000$个操作:一,给$x$加上$a*2^b$:二,问$x$的某个二进制位$k$.$b,k \leq 30n$,$|a| \leq 1e9$. 30暴露了一切..可以把30个二 ...