装饰器:是一种特殊的类型声明,它能够被附加到类声明,方法,属性或参数上。可以修改类的行为。
通俗来讲装饰器就是一个方法,可以注入到类、方法、属性参数上来扩展类,属性,方法,参数的功能。
常见的装饰器有:类装饰器,属性装饰器,方法装饰器,参数装饰器。
装饰器额写法:普通装饰器(无法传参),装饰器工厂(可传参)。
装饰器是过去js中最大的成就之一,已经是ES7的标准之一。

所谓装饰器就是在不修改类,函数,对象的前提下对其拓展。装饰装饰,就是在不修改主体结构的前提下对其进行拓展。

一、类装饰器

功能:在不修改类的前提下动态的扩展类的功能。

  1. function logClass(params:any){
  2. console.log(params);
  3. // parmas就是当前类
  4. params.prototype.name="cheng"
  5. }
  6. @logClass
  7. class HttpClient{
  8. constructor(){
  9. }
  10. getData(){
  11. }
  12. }
  13. var a:any = new HttpClient();
  14. console.log(a.name);}

二、装饰器工厂(带参数)

  1. function logClass(params:string){
  2. return function(target:any){
  3. console.log(target) //[Function: HttpClient]
  4. console.log(params) //"hello"
  5. }
  6. }
  7. @logClass("hello")
  8. class HttpClient{
  9. constructor(){
  10. }
  11. getData(){
  12. }
  13. }

2-1 给HttpClient类拓展一个属性

  1. function logClass(params:string){
  2. return function(target:any){
  3. target.prototype.apiUrl = params;
  4. }
  5. }
  6. @logClass("http://douban.uieee.com/v2")
  7. class HttpClient{
  8. constructor(){
  9. }
  10. getData(){
  11. }
  12. }
  13. var http:any = new HttpClient();
  14. console.log(http.apiUrl);

2-2 装饰器继承父类重载属性,方法

  1. function logClass(target:any){
  2. return class extends target{
  3. apiUrl:any = "https://www.baidu.com"
  4. getData(){
  5. console.log("change")
  6. }
  7. }
  8. }
  9. @logClass
  10. class HttpClient{
  11. public apiUrl:string|undefined;
  12. constructor(){
  13. this.apiUrl = "http://douban.uieee.com/v2"
  14. }
  15. getData(){
  16. console.log(this.apiUrl)
  17. }
  18. }
  1. function logClass(params:any){
  2. return class extends params {
  3. getData(){
  4. console.log("child")
  5. }
  6. }
  7. }
  8. @logClass
  9. class HttpClient{
  10. constructor(){
  11. }
  12. getData(){
  13. console.log("parent")
  14. }
  15. }
  16. var a:any = new HttpClient();
  17. a.getData();