版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/themagickeyjianan/article/details/87901013
/**
* 装饰器: 就像给人外衣一样,添加装饰器; 但是在ts中装饰器还处在试验阶段
*
* 1.继承让子类实现更多功能这种方式,可能形成超类,很复杂,并不是好的方式
*
* 2.AOP(切面编程)
* 1.静态注入方式
* 1.继承让子类实现更多功能这种方式,可能形成超类,很复杂,并不是好的方式
* 2.类、方法、属性
* 3.ts使用静态注入方式
*
* 2.反射机制: 动态的把需要注入的代码注入到我们想要注入的地方
* 1.java、c#等常用反射实现注解Reflect.decorate
*
* 3.符合开放封闭原则,类的解耦
* 1.mvc权限判断
* 2.注解
*
* 4.执行顺序
* 1.属性
* 2.方法
* 3.外围的从下往上依次执行
*
* 5.根据tsconfig.json中的target配置不同, es5和es6输出的详细信息不同. es5不清楚 es6比较清楚一点
*
* 6.根据反射可以动态创建东西
*/
/**
* 自定义一个Decorators
* @param target 一个类的声明 class prototype
* @param key 名称, 修饰的名字是什么 方法名等
* @param desc 描述 元数据说明 对一个类的详细描述
*/
function validate(target: string, key: string, desc: PropertyDescriptor) {
console.log("\nvalidate =", target, "\nkey =", key, "\ndesc =", desc);
}
function checkUser(target: string, key: string, desc: PropertyDescriptor) {
console.log("\ncheckUser =", target, "\nkey =", key, "\ndesc =", desc);
}
function formatFunc(target: string, key: string, desc: PropertyDescriptor) {
console.log("\nformatFunc =", target, "\nkey =", key, "\ndesc =", desc);
}
function test13(target: string, key: string, desc: PropertyDescriptor) {
console.log("\ntest13 -->", target, "\nkey -->", key, "\ndesc -->", desc);
}
// 采用工厂方式创建装饰器
function testFactory(n: boolean) {
return function (target: string, key: string, desc: PropertyDescriptor) {
console.log("\n -->", target, "\nkey -->", key, "\ndesc -->", desc);
}
}
@validate
@checkUser
@testFactory(false)
class Decorator {
@formatFunc
name: string = "";
constructor(){
}
@test13
method(): void{
}
}