1.装饰器模式
namespace a {
interface Animal {
swings: number;
fly: Function;
}
// 如果装饰器用来 装饰他的类的话 那么 target 就是他的构造函数
function flyable(target: any) {
target.propetype.swings = 2;
target.propetype.fly = function() {
console.log("我能起飞了");
};
}
@flyable
class Animal {
constructor() {
}
}
let _animal: Animal = new Animal();
console.log(_animal.swings);
console.log(_animal.fly());
}
namespace a {
interface Animal {
swings: number;
fly: Function;
}
// 如果传参的话 这个就是可以拿到他的参数值
function flyable(swings: any) {
return function flyable(target: any) {
target.propetype.swings = swings;
target.propetype.fly = function() {
console.log("我能起飞了");
};
}
}
@flyable(5)
class Animal {
constructor() {
}
}
let _animal: Animal = new Animal();
console.log(_animal.swings);
console.log(_animal.fly());
}
装饰器可以定义的类型
我们可以拿到这里的 参数做响应的处理, 可以自己写一些简单的装饰器, 也可以使用别人写好的装饰器
namespace a {
// 实例target 的类型的构造对象, key 是该实例的名字
function instancePropertyDecorator(target, key) {
target.propeName = "我是原型链上的属性";
// target.propeName 其实就是在 Circle 定义了一个 名字propeName 的实例, 因为 target 是类型的构造对象
}
// 类的静态实例target 的类型的构造对象, key 是该实例的名字
function classPropertyDecorator(target, key) {
}
// 实例方法的target是类的原型, key 是该实例的名字, decriptor是属性描述符
function instanceMethodDecorator(target, key, decriptor) {
}
// 静态实例方法的target是类的原型, key 是该实例的名字, decriptor是属性描述符
function classmethodDecorator(target, key, decriptor) {
}
class Circle {
// 这里 我们给他 添加装饰器
@instancePropertyDecorator
instanceProperty: string; // 实例shu属性
@classPropertyDecorator
static classProperty: string; // 静态属性
@instanceMethodDecorator
instanceMethod() { // 实例方法
}
@classmethodDecorator
static classmethod() { //静态方法
}
// 上面的 target.propeName = "我是原型链上的属性"; 就相当于下面的这个意思
// Circle.propetype.propeName = "我是原型链上的属性";
}
}
推荐一个装饰器的包, core-decorators 到这里去, 这个包里面 有别人写了很多 很好的装饰器, 可以使用