JavaScript设计模式之装饰器模式
栏目: JavaScript · 发布时间: 5年前
内容简介:为对象添加新功能;不改变其原有的结构和功能。
为对象添加新功能;不改变其原有的结构和功能。
手机壳就是装饰器,没有它手机也能正常使用,原有的功能不变,手机壳可以减轻手机滑落的损耗。
代码示例
class Circle { draw() { console.log('画一个圆形') } } class Decorator { constructor(circle) { this.circle = circle } draw() { this.circle.draw() this.setRedBorder(circle) } setRedBorder(circle) { console.log('设置红色边框') } } // 测试 let circle = new Circle() circle.draw() let decorator = new Decorator(cicle) decorator.draw()
ES7装饰器
// 简单的装饰器 @testDec // 装饰器 class Demo {} function testDec(target){ target.isDec = true } console.log(Demo.isDec) // true
// 装饰器原理 @decorator class A {} // 等同于 class A {} A = decorator(A) || A; // 把A 作为参数,返回运行的结果
// 传参数 function testDec(isDec) { return function(target) { // 这里要 return 一个函数 target.isDec = isDec; } } @testDec(true) class Demo { // ... } alert(Demo.isDec) // true
装饰类
function mixins(...list) { return function (target) { Object.assign(target.prototype, ...list) } } const Foo = { foo() { console.log('foo') } } @mixins(Foo) class MyClass{} let myclass = new MyClass() myclass.foo() // 'foo'
装饰方法
// 例1 只读 function readonly(target, name, descriptor){ // descriptor对象原来的值如下 // { // value: specifiedFunction, // enumerable: false, // 可枚举 // configurable: true, // 可配置 // writable: true // 可写 // }; descriptor.writable = false; return descriptor; } class Person { constructor() { this.first = 'A' this.last = 'B' } @readonly name() { return `${this.first} ${this.last}` } } var p = new Person() console.log(p.name()) p.name = function () {} // 这里会报错,因为 name 是只读属性
// 例2 打印日志 function log(target, name, descriptor) { var oldValue = descriptor.value; descriptor.value = function() { // 1. 先打印日子 console.log(`Calling ${name} with`, arguments); // 2. 执行原来的代码,并返回 return oldValue.apply(this, arguments); }; return descriptor; } class Math { @log add(a, b) { return a + b; } } const math = new Math(); const result = math.add(2, 4); console.log('result', result);
最后
创建了一个前端学习交流群,感兴趣的朋友,一起来嗨呀!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 设计模式——订阅模式(观察者模式)
- 设计模式-简单工厂、工厂方法模式、抽象工厂模式
- java23种设计模式-门面模式(外观模式)
- 设计模式-享元设计模式
- Java 设计模式之工厂方法模式与抽象工厂模式
- JAVA设计模式之模板方法模式和建造者模式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web开发敏捷之道
Sam Ruby、Dave Thomas、David Heineme Hansson / 慕尼黑Isar工作组、骆古道 / 机械工业出版社 / 2012-3-15 / 59.00元
本书第1版曾荣获Jolt大奖“最佳技术图书”奖。在前3版的内容架构基础上,第4版增加了关于Rails中新特性和最佳实践的内容。本书从逐步创建一个真正的应用程序开始,然后介绍Rails的内置功能。全书分为3部分,第一部分介绍Rails的安装、应用程序验证、Rails框架的体系结构,以及Ruby语言的知识;第二部分用迭代方式创建应用程序,然后依据敏捷开发模式搭建测试案例,最终用Capistrano完成......一起来看看 《Web开发敏捷之道》 这本书的介绍吧!