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

通俗的讲装饰器就是一个方法,可以注入到类、方法、属性参数上来扩展类、属性、方法、参数的功能。

常见的装饰器有:

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

装饰器的写法:

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

装饰器是过去几年中js最大的成就之一,已是Es7的标准特性之一

类装饰器

普通装饰器(无法传参)

function logClass(params:any){

            console.log(params);
// params 就是当前类
params.prototype.apiUrl='动态扩展的属性';
params.prototype.run=function(){
console.log('我是一个run方法');
} } @logClass
class HttpClient{
constructor(){
}
getData(){ }
}
var http:any=new HttpClient();
console.log(http.apiUrl); //动态扩展的属性
http.run(); //我是一个run方法

装饰器工厂(可传参)

function logClass(params:string){
return function(target:any){
console.log(target); //当前类:HttpClient
console.log(params); //http://www.itying.com/api
target.prototype.apiUrl=params;
}
} @logClass('http://www.itying.com/api')
class HttpClient{
constructor(){
} getData(){ }
} var http:any=new HttpClient();
console.log(http.apiUrl);

属性装饰器

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

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

2、成员的名字。

//类装饰器
function logClass(params:string){
return function(target:any){
// console.log(target);
// console.log(params); }
} //属性装饰器
function logProperty(params: any) {
return function (target: any, attr: any) {
console.log(target);
console.log(attr);
target[attr] = params;
}
}
@logClass('xxxx') class HttpClient { @logProperty('监视属性')
public url: any | undefined; constructor() {
} getData() {
console.log(this.url);
}
}
var http = new HttpClient();
http.getData();

方法装饰器

它会被应用到方法的 属性描述符上,可以用来监视,修改或者替换方法定义。

方法装饰会在运行时传入下列3个参数:

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

2、成员的名字。

3、成员的属性描述符。

扩展方法

正常的扩展方法.

function get(params:any){

    return function(target:any,methodName:any,desc:any){
console.log(`0.params${params}`);
console.log(`1.target:`);
console.log(target);
console.log("2.methodName:");
console.log(methodName);
console.log("3.desc:");
console.log(desc);
target.Apiurl='xxxx';
target.run=function(){
console.log('5.run');
}
}
} class HttpClient{
public url:any |undefined; constructor(){
} @get('param参数在这里~~~')
getData(){
console.log("6.this.url");
console.log(this.url);
}
} var http:any=new HttpClient();
console.log("4.http.Apiurl");
console.log(http.Apiurl);
http.run();
http.getData();

修改方法内容

function get(params:any){

    return function(target:any,methodName:any,desc:any){
// console.log(`0.params${params}`);
// console.log(`1.target:`);
// console.log(target);
// console.log("2.methodName:");
// console.log(methodName);
// console.log("3.desc:");
// console.log(desc); //修改装饰器的方法 把装饰器方法里面传入的所有参数改为string类型 let oMethod = desc.value;
desc.value = function name(...args:any[]) {
args = args.map(value=>{
return String(value);
}) oMethod.apply(this,args);
console.log(args);
}
}
} class HttpClient{
public url:any |undefined; constructor(){
} @get('param参数在这里~~~')
getData(){
console.log("这里是getData方法内~");
}
} var http:any=new HttpClient();
http.getData(123,"aabb");

typescript - 9.装饰器的更多相关文章

  1. TypeScript 中装饰器的理解?应用场景?

    一.是什么 装饰器是一种特殊类型的声明,它能够被附加到类声明,方法, 访问符,属性或参数上 是一种在不改变原类和使用继承的情况下,动态地扩展对象功能 同样的,本质也不是什么高大上的结构,就是一个普通的 ...

  2. TypeScript 素描 - 装饰器

    /* 装饰器 简单理解为C#中的Attribute 可以装饰到类.函数.讯问符.属性.参数上 语法 @xxx 装饰器其实是一个函数 @xxx 就要有一个 function xxx 多个装饰器可以用来装 ...

  3. 从C#到TypeScript - 装饰器

    总目录 从C#到TypeScript - 类型 从C#到TypeScript - 高级类型 从C#到TypeScript - 变量 从C#到TypeScript - 接口 从C#到TypeScript ...

  4. TypeScript装饰器(decorators)

    装饰器是一种特殊类型的声明,它能够被附加到类声明,方法, 访问符,属性或参数上,可以修改类的行为. 装饰器使用 @expression这种形式,expression求值后必须为一个函数,它会在运行时被 ...

  5. Angular 个人深究(一)【Angular中的Typescript 装饰器】

    Angular 个人深究[Angular中的Typescript 装饰器] 最近进入一个新的前端项目,为了能够更好地了解Angular框架,想到要研究底层代码. 注:本人前端小白一枚,文章旨在记录自己 ...

  6. 转发: Angular装饰器

    Angular中的装饰器是一个函数,它将元数据添加到类.类成员(属性.方法)和函数参数. 用法:要想应用装饰器,把它放在被装饰对象的上面或左边. Angular使用自己的一套装饰器来实现应用程序各部件 ...

  7. JS中bind、call和apply的作用以及在TS装饰器中的用法

    目录 1,前言 1,call 1.1,例子 1.2,直接调用 1.3,将this指向另一个对象 1.4,传递参数 2,apply 2.1,例子 2.2,直接调用 2.3,将this指向另一个对象 2. ...

  8. 基于TypeScript装饰器定义Express RESTful 服务

    前言 本文主要讲解如何使用TypeScript装饰器定义Express路由.文中出现的代码经过简化不能直接运行,完整代码的请戳:https://github.com/WinfredWang/expre ...

  9. Typescript中的装饰器原理

    Typescript中的装饰器原理 1.小原理 因为react中的高阶组件本质上是个高阶函数的调用, 所以高阶组件的使用,我们既可以使用函数式方法调用,也可以使用装饰器. 也就是说,装饰器的本质就是一 ...

随机推荐

  1. option触发及获取当前选中的option值

    #标签 #<select id="city" class="select"> #JavaScript #$("#city").c ...

  2. 关于Spring IOC (DI-依赖注入)你需要知道的一切

    <Spring入门经典>这本书无论对于初学者或者有经验的工程师还是很值一看的,最近花了点时间回顾了Spring的内容,在此顺带记录一下,本篇主要与spring IOC相关 ,这篇博文适合初 ...

  3. Java入门(二)——泛型

    如果你写过前端,可能会经常写一下关于变量类型的判断,比如:typeof fn === 'function'之类的代码.因为JavaScript作为一门弱类型语言,类型的判断往往需要开发人员自己去检查. ...

  4. 24.centos7基础学习与积累-010-上机考核命令练习

    从头开始积累centos7系统运用 大牛博客:https://blog.51cto.com/yangrong/p5 1.创建目录/data/oldboy,并且在该目录下创建文件oldboy.txt,然 ...

  5. 大数据之路week07--day07 (修改mysql默认编码)

    在Sqoop导入或者导出,我们在查看mysql的时候会出现中文乱码大部分乱码会是?这样的问号,那么该怎么处理呢? 1.打开my.cnf文件  vim /etc/my.cnf 2.找到对应需要修改的地方 ...

  6. Serializable的作用

    前两天接触到VO,DTO,entity这些概念,发现别人的代码中会有 implements serializable这个东西,之前并没有见过这种写法,就去了解了一下原因 import java.io. ...

  7. 开发Electron可能用到的工具

    nodejs:搭载谷歌v8内核的高性能的node环境npm:包管理工具webpack:模块打包器jQuery:js必备库Bootstrap:css必备库react:用于构建用户界面的库vue:构建数据 ...

  8. WebService(一)

    最近一段时间研究webservice,一般来说,开发java的Webservice经常使用axis2和cxf这两个比较流行的框架 先使用cxf,开发一个完整示例,方便对webservice有一个整体的 ...

  9. mybatis的注意事项一

    在UserMapper.xml文件中写resultType="cn.smbms.dao.pojo.User"返回类型的全路径是不是很长,而且也比较不美观:不便于后期项目的维护. 解 ...

  10. shell脚本sed的基本用法

    sed 我们首先准备了一个测试文件 1. s 替换  将文件中的This替换cyy 在替换的时候如果加入了 -i 选项就会真的替换,但是只会替换每一行的第一个 -n 和 -p 一起使用表示的是打印那些 ...