简单理解 ES7 Decorator(装饰器)
如何使用ES7 Decorator给你的游戏人物开挂?
// 预告: 本文有点小难度,对js不太熟的人可能比较懵逼
// 本文的目的是让你们知其然
// ==========================================
// 今天我们来说一说 es7的 装饰者模式(Decorator)
// 啥是装饰者模式,听着很高大上
// 我不和你扯什么设计模式,元编程,我从一个游戏的例子给大家讲解
// 装饰器就是给一个游戏玩家装饰上了一件牛逼的装备
// ES7 如何使用Decorator强化你的装备 // 1. 一个普通的玩家类,具有攻击力和防御力两项属性
class 玩家 {
// 默认 1点攻击,1点防御
constructor(攻击力 = 1, 防御力 = 1) {
this.init(攻击力, 防御力)
} // 初始化攻击力 防御力
init(攻击力, 防御力) {
this.攻击力 = 攻击力
this.防御力 = 防御力
}
print() {
console.log(`玩家 ==> 攻击力:${this.攻击力}, 防御力:${this.防御力}`)
}
} let player1 = new 玩家() // 创建一个玩家实例
player1.print() // '玩家 ==> 攻击力:1, 防御力:1' // 2. 这一步厉害了
// 我们创建一个方天画戟的装饰器,一出生自动加100攻击力
// 装饰器接受三个固定参数, (目标,属性,属性描述)
function 方天画戟(target, prop, descriptor) {
let func = descriptor.value // 获取目标的init方法
descriptor.value = function() {
// arguments[0]即第一个参数 => 攻击力
arguments[0] += 100 // 攻击力+100
return func.apply(target, arguments) // init(100, 1)
}
return descriptor // 知道为什么要返回它么
} // 升级版玩家,出生自带方天画戟
class 玩家2 {
constructor(攻击力 = 1, 防御力 = 1) {
this.init(攻击力, 防御力)
} // 在init初始化方法上写上 '@装饰器名称' 就把外挂加上了
// 另外装饰器是可以叠加的
// @马云 艾特一下马云,让你更有钱
// 这下子牛逼了
@方天画戟
init(攻击力, 防御力) {
this.攻击力 = 攻击力
this.防御力 = 防御力
}
print() {
console.log(`玩家 ==> 攻击力:${this.攻击力}, 防御力:${this.防御力}`)
}
} let player2 = new 玩家2() // 升级版玩家
player2.print() // '玩家 ==> 攻击力:101, 防御力:1' // 目前Decorator特性还没有任何浏览器支持
// 本文的代码需要使用babel编译之后才会看到结果 // *题外话*,如果你想知道Decorator是干什么的,本文可以帮助您理解
// 如果你想彻底搞懂Decorator,你还需要了解Object.defineProperty
// Object.defineProperty很强大,前端同学常用的vue就是基于此做的数据响应式
// 熟悉Java Python的同学对Decorator应该早已很熟悉了,强大的AOP,数据映射等等 // 本文完
转载:https://zhuanlan.zhihu.com/p/29712462
简单理解 ES7 Decorator(装饰器)的更多相关文章
- 装饰器模式&&ES7 Decorator 装饰器
装饰器模式(Decorator Pattern)允许向一个现有的对象动态添加新的功能,同时又不改变其结构.相比JavaScript中通过鸡肋的继承来给对象增加功能来说,装饰器模式相比生成子类更为灵活. ...
- 谈谈Python中的decorator装饰器,如何更优雅的重用代码
众所周知,Python本身有很多优雅的语法,让你能用一行代码写出其他语言很多行代码才能做的事情,比如: 最常用的迭代(eg: for i in range(1,10)), 列表生成式(eg: [ x* ...
- 简单理解Struts2中拦截器与过滤器的区别及执行顺序
简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...
- 理解Python的装饰器
看Flask文档时候看到关于cache的装饰器,有这么一段代码: def cached(timeout=5 * 60, key=’view/%s’): def decorator(f): @wraps ...
- Python的程序结构[8] -> 装饰器/Decorator -> 装饰器浅析
装饰器 / Decorator 目录 关于闭包 装饰器的本质 语法糖 装饰器传入参数 1 关于闭包 / About Closure 装饰器其本质是一个闭包函数,为此首先理解闭包的含义. 闭包(Clos ...
- Python进阶之decorator装饰器
decorator装饰器 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB&quo ...
- koa2使用es7 的装饰器decorator
本文主要讲述我在做项目中使用装饰器(decorator)来动态加载koa-router的路由的一个基础架构. 目前JavaScript 对decorator 是不支持,但是可以用babel 来编译 既 ...
- Decorator装饰器模式个人理解
对于装饰器模式,其主要是为了:在不改变本体特征的情况下,对其进行包装.装饰,目的是为了补充.扩展.增强其功能. 有三个原则: 不能改变本体的特征 要对本体的功能进行扩展 装饰器脱离了本体则没有任何含义 ...
- 项目解析1、登录验证用户是否存在 储备知识 Python 之 decorator装饰器
下面是我对 装饰器 这一小节的总结, 以及自己的理解. 注:[本文中的代码参考上述教程] 很多时候我会把Python的很多语法与C++相融合,在C++中,函数的名称即为函数的地址,我们可以通过定义成为 ...
随机推荐
- Django数据库的查看、删除,创建多张表并建立表之间关系
配置以下两处,可以方便我们直接右键运行tests.py一个文件,实现对数据库操作语句的调试: settings里面的设置: #可以将Django对数据库的操作语法,能输出对应的的sql语句 LOGGI ...
- java EE技术体系——CLF平台API开发注意事项(2)——后端测试
前言:上篇博客说到了关于开发中的一些情况,这篇博客主要说明一些关于测试的内容. 一.宏观说明 要求:每一个API都必须经过测试. 备注:如果涉及到服务间调用(如权限和基础数据),而对方服务不可用时 ...
- maven无法下载依赖jar包—几种仓库的区别
一.问题背景 最近这两天,感觉自己智商急剧退化,到了自己都捉急的地步,呃,有必要记录下来,以后智商被人甩几条街的时候,看看这篇文字,找找灵感也是好的! 这个项目呢,是用IDEA开发的,我一切都弄好了, ...
- DS博客作业06--图
1.本周学习总结 1.1.思维导图 1.2.谈谈你对图结构的认识及学习体会 本章学习了图结构的相关知识,图形结构属于复杂的非线性数据结构,在实际应用中很多问题可以用图来描述.在图结构中,每个元素可以有 ...
- Java中接口的作用
转载于:https://www.zhihu.com/question/20111251 困惑:例如我定义了一个接口,但是我在继承这个接口的类中还要写接口的实现方法,那我不如直接就在这个类中写实现方法岂 ...
- 【Luogu】P3311数数(AC自动机上DP)
题目链接 蒟蒻今天终于学会了AC自动机,感觉很稳 (后一句愚人节快乐) 这题开一个f[i][j][k]表示有没有受到限制,正在枚举第j位,来到了AC自动机的第k个节点 的方案数 随后可以刷表更新 注意 ...
- Eclipse + Jersey 发布RESTful WebService(一)了解Maven和Jersey,创建一个WS项目(成功!)
一.下文中需要的资源地址汇总 Maven Apache Maven网站 http://maven.apache.org/ Maven下载地址: http://maven.apache.org/down ...
- jenkins下添加HTML Publisher Plugin及配置
1.点击“系统设置”->“插件管理”,点击可选插件,搜索插件,如下: 2.点击直接安装,等待安装完成,如下: 3.在配置job中,在构建后操作,选择安装的HTML Publisher plugi ...
- Bzoj1452 Count
http://www.lydsy.com/JudgeOnline/problem.php?id=1452 题目全是图片,不复制了. 开100个二维树状数组,分别记录区间内各个颜色的出现位置…… 简单粗 ...
- 应用node+express+mysql 实现简单的增删改查
记录下来备忘 1.准备好webstrom编辑器,编辑器调整字体大小等在file->settings->editor下设置 注册码 来源网上: 2017.2.27更新 选择“license ...