typescript - 9.装饰器
装饰器:装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为。
通俗的讲装饰器就是一个方法,可以注入到类、方法、属性参数上来扩展类、属性、方法、参数的功能。
常见的装饰器有:
- 类装饰器
- 属性装饰器
- 方法装饰器
- 参数装饰器
装饰器的写法:
- 普通装饰器(无法传参)
- 装饰器工厂(可传参)
装饰器是过去几年中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.装饰器的更多相关文章
- TypeScript 中装饰器的理解?应用场景?
		一.是什么 装饰器是一种特殊类型的声明,它能够被附加到类声明,方法, 访问符,属性或参数上 是一种在不改变原类和使用继承的情况下,动态地扩展对象功能 同样的,本质也不是什么高大上的结构,就是一个普通的 ... 
- TypeScript 素描 - 装饰器
		/* 装饰器 简单理解为C#中的Attribute 可以装饰到类.函数.讯问符.属性.参数上 语法 @xxx 装饰器其实是一个函数 @xxx 就要有一个 function xxx 多个装饰器可以用来装 ... 
- 从C#到TypeScript - 装饰器
		总目录 从C#到TypeScript - 类型 从C#到TypeScript - 高级类型 从C#到TypeScript - 变量 从C#到TypeScript - 接口 从C#到TypeScript ... 
- TypeScript装饰器(decorators)
		装饰器是一种特殊类型的声明,它能够被附加到类声明,方法, 访问符,属性或参数上,可以修改类的行为. 装饰器使用 @expression这种形式,expression求值后必须为一个函数,它会在运行时被 ... 
- Angular 个人深究(一)【Angular中的Typescript 装饰器】
		Angular 个人深究[Angular中的Typescript 装饰器] 最近进入一个新的前端项目,为了能够更好地了解Angular框架,想到要研究底层代码. 注:本人前端小白一枚,文章旨在记录自己 ... 
- 转发: Angular装饰器
		Angular中的装饰器是一个函数,它将元数据添加到类.类成员(属性.方法)和函数参数. 用法:要想应用装饰器,把它放在被装饰对象的上面或左边. Angular使用自己的一套装饰器来实现应用程序各部件 ... 
- 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. ... 
- 基于TypeScript装饰器定义Express RESTful 服务
		前言 本文主要讲解如何使用TypeScript装饰器定义Express路由.文中出现的代码经过简化不能直接运行,完整代码的请戳:https://github.com/WinfredWang/expre ... 
- Typescript中的装饰器原理
		Typescript中的装饰器原理 1.小原理 因为react中的高阶组件本质上是个高阶函数的调用, 所以高阶组件的使用,我们既可以使用函数式方法调用,也可以使用装饰器. 也就是说,装饰器的本质就是一 ... 
随机推荐
- 改变默认的多选框 checkbox 样式~
			效果图: HTML代码: <label for="Checkbox1" style="display:none;"></label> & ... 
- Docker基础用法篇
			Docker基础用法篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装docker 1>.依赖的基础环境 64 bits CPU Linux Kerner 3.10+ ... 
- vim中自动补全插件snipmate使用
			vim中自动补全插件snipmate使用 1.下载snipMatezip:https://github.com/msanders/snipmate.vim/archive/master.zip 2.解 ... 
- C# 保存文件到数据库
			html <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FileUploa ... 
- Docker 基本操作(附 redis、nginx部署)
			下载安装 Docker 也有一个月了.中间看过几次也没有深入的了解研究.就只是拉取了两个镜像简单的看了看. 昨天因一个项目中需要用到 Redis ,因为是 Windows 系统,看了下安装包比较老了有 ... 
- jquery easyui 1.3.4 datagrid pageNumber 設置導致兩次請求的解决方案
			$('#table').datagrid({ url: '/get/data/path/to/your/server', pageNumber: , pageSize: , ... }); 當手動設置 ... 
- Navicat 的使用 —— 快捷键
			名称 功能 备注 Ctrl+Q 打开查询窗口 Ctrl+/ 注释sql语句 Ctrl+R 运行查询窗口的sql语句 Ctrl+Shift+R 只运行选中的sql语句 F6 打开一 ... 
- springboot项目报错Could not resolve placeholder 'datasource.type' in value "${datasource.type}"解决办法
			一,首先确认数据库的连接信息是否都正确,数据库能否正常连接(例如用客户端能连接上):二,确认配置文件中datasource.type配置是否正确,此处我们公司用的阿里的是com.alibaba.dru ... 
- MyBatis框架-ResultMap节点
			需求:查询结果要求显示用户名,用户密码,用户的角色 因为在用户表中只有用户角色码值,没有对应的名称,角色名称是在码表smbms_role表中,这时我们就需要联表查询了. 之前我们使用的是给查询结果字段 ... 
- 基于Ubuntu1604+ROS-kinetic+roscpp的激光雷达定位算法从零开始移植
			调试的过程太麻烦了,因此打算详细解释一下每步的含义,很多地方懂了之后发现其实很简单,但是学起来却发现很多地方无从下手,因为资料太少了,真的都是不断踩坑一点一点摸索出来的,写以此文以便后人乘凉 此处将展 ... 
