zoukankan      html  css  js  c++  java
  • TS之装饰器① 类装饰器&属性装饰器

    装饰器:

      装饰器是一种特殊类型的声明,它能被附加到类声明,方法,属性或者参数上,可以修改类的行为。

      装饰器使用 @expression这种形式,expression求值后必须为一个函数,它会在运行时被调用,被装饰的声明信息做为参数传入。

    常见的装饰器有:

      类装饰器、属性装饰器、方法装饰器、参数装饰器

    装饰器的写法:

      普通装饰器(无法传参)、装饰器工厂(可传参)

    1.类装饰器:

    类装饰器在类声明之前被声明(紧靠着类声明)。类装饰器应用于类构造函数,可以用来监视、修改或者 替换类定义。

    (1)普通装饰器

    // 定义普通装饰器
    function logClass(params: any) {
      console.log(params);
    
      // 动态扩展的属性
      params.prototype.apiUrl = 'xxx';
      // 动态扩展的方法
      params.prototype.run = function () {
        console.log('我是一个run方法');
      }
    }
    
    // 使用类装饰器(普通装饰器,无法传参)
    @logClass
    class HttpClient {
      constructor() {
      }
    
      getData() {
      }
    }
    
    let http = new HttpClient();

     (2)装饰器工厂

    // 定义装饰器工厂
    function logClass(params: string) {
      return function (target: any) {
        console.log('target:', target);
        console.log('params:', params);
    
        target.prototype.apiUrl = params;
      }
    }
    
    // 使用类装饰器:装饰器工厂,可传参(相当于把hello给了params,下面这个类给了target)
    @logClass('http:www.baidu.com')
    class HttpClient {
      constructor() {
      }
    
      getData() {
      }
    }
    
    let http = new HttpClient();
    console.log(http.apiUrl);

    类装饰器重载构造函数的例子:

      类装饰器表达式会在运行时当作函数被调用,类的构造函数(constructor)作为其唯一的参数;如果类装饰器返回一个值,它会使用提供的构造函数来替换类的声明;

    // 定义装饰器工厂
    function logClass(target: any) {
      console.log(target);
    
     // 把类的构造函数作为参数传入,并修改构造函数
    return class extends target { // 修改当前类的构造函数 apiUrl: any = "我是在装饰器里面修改后的apiUrl" // 修改方法 getData() { this.apiUrl = this.apiUrl + '====='; console.log(this.apiUrl); } } } @logClass class HttpClient { public apiUrl: string | undefined; constructor() { this.apiUrl = "我是构造函数里面的apiUrl" } getData() { console.log(this.apiUrl); } } let http = new HttpClient(); http.getData();

     2.属性装饰器

      属性装饰器表达式会在运行时当作函数被调用,传入下列两个参数:

    • 对于静态成员来说是类的构造函数,对于实例成员是类的原型对象
    • 成员的名字
    // 定义类装饰器
    function logClass(params: string) {
      return function (target: any) {
        console.log(target);
        console.log(params);
      }
    }
    
    // 定义属性装饰器
    function logProperty(params: any) {
      // target--->类的原型对象;attr--->传入的参数url
      return function (target: any, attr: any) {
        console.log(target, attr);
    
        target[attr] = params
      }
    }
    
    @logClass('xxxx')
    class HttpClient {
    
      @logProperty('http://www.baidu.com')
      public url: any | undefined;
      constructor() {
    
      }
      getData() {
        console.log(this.url);
      }
    }
    
    let http = new HttpClient();
    http.getData();
  • 相关阅读:
    GNU Linux中的SO_RCVLOWAT和SO_SNDLOWAT说明
    Spring.NET 的IOC(依赖注入)
    c# post 数据的方法
    C# .NET中的 反射的应用
    C# .NET修改注册表
    DataTabel DataSet 对象 转换成json
    sqlserver 行转列
    asp.net 二级域名session共享
    Asp.Net集群中Session共享
    微软企业库DBBA的研究
  • 原文地址:https://www.cnblogs.com/codexlx/p/12773576.html
Copyright © 2011-2022 走看看