装饰器模式

为对象添加新功能

不改变其原有的结构和功能

传统 UML 类图

javascript 中的装饰器

装饰类


@testDec
clss Demo { } function testDec(target) {
target.isDec = true
} alert(Demo.isDec)

@testDec(false)
clss Demo { } function testDec(isDec) {
return function (target) {
target.isDec = isDec
}
} alert(Demo.isDec)

装饰器原理

@decorator
class A {} //等同于 class A {}
A = decorator(a) || A;

装饰类-mixin 示例

function mixins(...list) {
return function(target) {
Object.assign(target.prototype, ...list);
};
} const Foo = {
foo() {
alert("foo");
}
}; @mixins(Foo)
class MyClass {} let obj = new MyClass();
obj.foo(); // 'foo'

装饰方法

one

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 是只读属性

two

function log(target, name, descriptor) {
var oldValue = descriptor.value; descriptor.value = function() {
console.log(`Calling ${name} with`, arguments);
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);

core-decorators

  • 第三方开源 lib
  • 提供常用的装饰器
  • 文档
  • 执行npm i core-decorators --save

使用

想用什么装饰器,直接引入就行了

one

import { readonly } from "core-decorators";

class Person {
@readonly
name() {
return "zhang";
}
} let p = new Person();
alert(p.name());
// p.name = function () { /*...*/ } // 此处会报错

two

import { deprecate } from "core-decorators";

class Person {
@deprecate
facepalm() {} @deprecate("We stopped facepalming")
facepalmHard() {} @deprecate("We stopped facepalming", {
url: "http://knowyourmeme.com/memes/facepalm"
})
facepalmHarder() {}
} let person = new Person(); person.facepalm();
// DEPRECATION Person#facepalm: This function will be removed in future versions. person.facepalmHard();
// DEPRECATION Person#facepalmHard: We stopped facepalming person.facepalmHarder();
// DEPRECATION Person#facepalmHarder: We stopped facepalming
//
// See http://knowyourmeme.com/memes/facepalm for more details.

设计原则验证

  • 将现有对象和装饰器进行分离,两者独立存在
  • 符合开放封闭原则

最新文章

  1. padding标准盒模型和怪异盒子模型
  2. addEventListener进一步了解
  3. 来自于2016.2.23的flag
  4. CentOS搭建Redis集群
  5. Android代码写View
  6. HDU 2501 Tiling_easy version(简单递推)
  7. java数组排序之冒泡排序
  8. uploadify在struts2下的使用
  9. MySQL对于有大量重复数据表的处理方法
  10. oomph
  11. 使用JSONObject生成和解析json
  12. 关机充电如何实现短按pwrkey灭屏
  13. Ocelot中文文档-管理
  14. [Swift]LeetCode312. 戳气球 | Burst Balloons
  15. MapReduce输出文件名更改
  16. 通过crt修改数据库中的存储过程
  17. for(var i=1;i<=3;i++){ setTimeout(function(){ console.log(i); },0); };答案:4 4 4。
  18. 【转】ELK 日志分析系统
  19. underscore.js源码研究(4)
  20. LigerUI下拉选择列表LigerComboBox中tree的节点初始化默认选中的问题

热门文章

  1. Qt Installer Framework翻译(5-4)
  2. Docker windows nanoserver/mysql镜像root用户密码错误
  3. Windows下安装Hadoop、Spark和HBase
  4. Mbp通过筛选器和中间件实现异常,日志,事务及接口返回数据格式化aop处理.
  5. Mac 解决IDEA无法启动的问题
  6. Gradle | Gradle项目无法导入依赖包
  7. Linux防火墙之iptables常用扩展匹配条件(一)
  8. <状压DP>solution-HDU5691_Sitting in Line
  9. 实验21:IPv6
  10. 探究HashMap1.8的扩容