位置:首页 > web前端 > typescript

typescript装饰器

dearweb 发布:2021-08-01 11:27:54阅读:

常见的装饰器有:类装饰器、属性装饰器、方法装饰器、参数装饰器。装饰器的写法:普通装饰器(无法传参),装饰器工厂(可传参)。装饰器是过去几年中js最大的成就之一,已是es7的标准之一。

普通装饰器

//装饰器
// function logClass(params:any){
//     console.log(params)

//     params.prototype.apiUrl = '动态扩展属性'
//     params.prototype.apiRun = function(){
//         console.log('我在跑步')
//     }
// }

// @logClass
// class HttpClient {
//     constructor() {
        
//     }
//     getData(){

//     }
// }

// let http = new HttpClient()
// console.log(http) // [Prototype]
// console.log(http.apiRun())  //我在跑步

装饰器工厂(可传参)

// function logClass(params:string){
//     return function(target:any){
//         console.log(target,params) // ƒ HttpClient() {}    "hello"
//         target.prototype.hello = params
//     }
// }

// @logClass('hello')
// class HttpClient {
//     constructor() {
        
//     }
//     getData(){
//     }
// }

// let http = new HttpClient()
 
// console.log(http.hello)  // hello

类装饰器

类装饰器下面是一个重载构造函数的例子,类装饰器表达式会在运动时当做函数被调用,类的构造函数作为其唯一的参数,如果类装饰器返回一个值,它会使用提供的构造函数来替换类的声明。

// function logClass(target:any){
//      console.log(target) // ƒ HttpClient() {this.APIUrl = 'dearweb.cn';}
//      return class extends target {
//          APIUrl:any = 'wuhan.com'
//          getData(){
//              console.log(this.APIUrl)
//          }
//      }
// }

// @logClass
// class HttpClient {
//     public APIUrl:string| undefined
//     constructor() {
//         this.APIUrl = 'dearweb.cn'
//     }
//     getData(){
//         console.log(this.APIUrl)
//     }
// }

// let http = new HttpClient()
// console.log(http) // APIUrl: "wuhan.com"   [[Prototype]]: HttpClient   constructor: ƒ class_1()   getData: ƒ ()

属性装饰器

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

1.对于静态成员来说是类的构造函数,对于实例成员来说是类的原型对象

 2.成员的名字

// 类装饰器
function logClass(params:any){
     return function(target:any) {
            // console.log(params,target);
            
     }
}

// 属性装饰器

function logProperty(params:any){
    return function(target:any,attr:any){
        console.log(target,attr);
        target[attr] = params
    }
}
@logClass('www.dearweb.cn')
class HttpClient {
    @logProperty('http://baidu.com')
    public url:any| undefined
    constructor() {
    }
    getData(){
        console.log(this.url)
    }
}

let http = new HttpClient()
http.getData()


24人点赞 返回栏目 提问 分享一波

小礼物走一波,支持作者

还没有人赞赏,支持一波吧

留言(问题紧急可添加微信 xxl18963067593) 评论仅代表网友个人 留言列表

暂无留言,快来抢沙发吧!

本刊热文
网友在读
手机扫码查看 手机扫码查看