ts中的裝飾器


// 裝飾器一種特殊的類的聲明, 擴展類、屬性、方法。
function logClass(params:any) {
  console.log(params); // params代表HttpClict這個類
  params.propotype.apiurl = 'fadsf';
}
// 普通裝飾器
@logClass
class HttpClict {
  constructor() {

  }
  getdata() {

  }
}
// 裝飾器工廠
//類裝飾器
function logClass1(params:any) {
  return function(target:any) {
    console.log(target) //當前類
    console.log(params) // 調用裝飾器傳入實參
  }
}
//屬性裝飾器
function attr(params:any) {
  return function(target:any,attr:any){
    console.log(params) // 屬性url傳入的形參
    console.log(target) // 當前類
    console.log(attr) //當前屬性名稱
    target[attr] = params; // 修改構造函數里面的屬性
  }
}
// 方法裝飾器
/**
* 方法裝飾器會在運行時傳入三個參數
* 1.對於靜態成員來說是類的構造函數,對於實例成員是類的原型對象
* 2.成員的名字
* 3.成員屬性的描述符
*/

function logMethod(params:any) {
  return function(target:any,methodName:any,desc:any) {
    console.log(target)
    console.log(methodName)
    console.log(desc)
  }
}
//方法參數裝飾器
/**
* 1.對於靜態成員來說是類的構造函數,對於實例成員來說是類的原型對象
* 2.參數 的名字
* 3.參數在函數參數列表中的索引
*/
function logParams(params:string) {
  return function(target:any,methodName:any,paramsIndes:any) {
    console.log(target)
    console.log(methodName)
    console.log(paramsIndes)
}
}
@logClass1('fsdf')
class HttpClict1 {
  @attr('12')
  url:string | undefined;
  constructor() {

  }
  @logMethod('123')
  getdata(@logParams('12') param:any) {

  }
}

// 裝飾器執行順序
// 屬性裝飾器 -> 方法裝飾器 -> 類裝飾器
// 相同裝飾器從后向前執行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM