1. 程式人生 > 實用技巧 >Js裝飾器?

Js裝飾器?

裝飾器

  • 裝飾器:裝飾器是一種特殊型別的宣告,它能夠被附加到類宣告,方法,屬性或引數上,可以修改類的行為。
  • 通俗的講裝飾器就是一個方法,可以注入到類、方法、屬性引數上來擴充套件類、屬性、方法、引數的功能。
  • 常見的裝飾器有:類裝飾器、屬性裝飾器、方法裝飾器、引數裝飾器
  • 裝飾器的寫法:普通裝飾器(無法傳參) 、 裝飾器工廠(可傳參)
  • 裝飾器是過去幾年中js最大的成就之一,已是Es7的標準特性之一

1.類修飾器

①類裝飾器:普通裝飾器(無法傳參)

 function logClass(params:any){

console.log(params);
    // params 就是當前類
    params.prototype.apiUrl='動態擴充套件的屬性';
    params.prototype.run=function(){
    	console.log('我是一個run方法');
    }

}

@logClass
class HttpClient{
    const
ructor(){ } getData(){ } } var http:any=new HttpClient(); console.log(http.apiUrl); http.run();

②類裝飾器:裝飾器工廠(可傳參)

   function logClass(params:string){
       return function(target:any){
           console.log(target);
           console.log(params);
           target.prototype.apiUrl=params;
       }
   }

   @logClass('http://www.itying.com/api')
   class HttpClient{
       const
ructor(){ } getData(){ } } var http:any=new HttpClient(); console.log(http.apiUrl);

③類裝飾器 重構建構函式

function logClass(target:any){
    console.log(target);
    return class extends target{
        apiUrl:any='我是修改後的資料';
        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); } } var http=new HttpClient(); http.getData();

2.屬性修飾符

屬性裝飾器表示式會在執行時當作函式被呼叫,傳入下列2個引數:

1、對於靜態成員來說是類的建構函式,對於例項成員是類的原型物件。

2、成員的名字。

function logProperty(params:any){
        return function(target:any,attr:any){
            console.log("logProperty",target);
            console.log("logProperty",attr);
            target[attr]=params;
        }
    }
    
 class HttpClient{
     @logProperty('http://itying.com1')
     public url:any |undefined;
     constructor(){
     }
     getData(){
     	console.log(this.url);
     }
 }
 var http=new HttpClient();
 http.getData();


3.方法裝飾器

 function get(params:any){
     return function(target:any,methodName:any,desc:any){
         console.log(target);
         console.log(methodName);
         console.log(desc.value);       

    //修改裝飾器的方法  把裝飾器方法裡面傳入的所有引數改為string型別

    //1、儲存當前的方法

    var oMethod=desc.value;
        desc.value=function(...args:any[]){                
            args=args.map((value)=>{
            	return String(value);
            })
            oMethod.apply(this,args);
            }
        }
    }
class HttpClient{  
    public url:any |undefined;
    constructor(){
    }
    @get('http://www.itying,com')
    getData(...args:any[]){
        console.log(args);
        console.log('我是getData裡面的方法');
    }
}

var http=new HttpClient();
http.getData(123,'xxx');

資源搜尋網站大全 https://www.renrenfan.com.cn 廣州VI設計公司https://www.houdianzi.com

4.引數裝飾器

引數裝飾器表示式會在執行時當作函式被呼叫,可以使用引數裝飾器為類的原型增加一些元素資料,傳入下列3個引數:

  • 1、對於靜態成員來說是類的建構函式,對於例項成員是類的原型物件。

  • 2、方法的名字。

  • 3、引數在函式引數列表中的索引。

function logParams(params:any){
  return function(target:any,methodName:any,paramsIndex:any){
      console.log(params);
      console.log(target);
      console.log(methodName);
      console.log(paramsIndex);
      target.apiUrl=params;
  }   
}
class HttpClient{
public url:any |undefined; constructor(){ }
getData(@logParams('xxxxx') uuid:any){
console.log(uuid); } }
var http:any = new HttpClient(); http.getData(123456); console.log( http.apiUrl);

總結:

執行順序: 屬性》方法》方法引數》類;如果有多個同樣的裝飾器,它會先執行後面的