修身养性,知行合一

  • 首页
  • 爱码
    • 系统
    • 数据库
    • JavaScript
    • CSharp
    • Python
  • 生活
    • 文化
    • 美食
  • 杂谈
  • 关于
修身养性,知行合一
码字,杂谈
  1. 首页
  2. 爱码
  3. 前端
  4. JavaScript
  5. 正文

js的装饰符 @

2020年5月7日 3197点热度 0人点赞 0条评论

js中的装饰器一直处于提案阶段,所以要是用装饰符@,就需要通过babel进行解析。

安装babel的插件

如果 babel < 7.x:

1、安装npm install --save-dev babel-plugin-transform-decorators-legacy
2、在.babelrc文件中添加:

{
    "plugins": ["transform-decorators-legacy]
}
如果babel >= 7.x:

1、安装npm install --save-dev @babel/plugin-proposal-decorators
2、在.babelrc文件中添加:

{
    "plugins": [
        ["@babel/plugin-proposal-decorators", { "legacy": true }],
    ]
}
注意顺序:

如果插件中添加了transform-class-properties,需要保证它在装饰器插件的后面。

装饰符的使用

要理解一个装饰器,可以通过下面这个小例子:

class Circle {
    draw() {
        console.log("画一个圆");
    }
}

class Decorator {
    constructor(circle) {
        this.circle = circle;
    }

    draw() {
        this.circle.draw();
        this.setRedBorder(this.circle);
    }

    setRedBorder(circle) {
        console.log("设置红色边框");
    }
}

// 测试
let c = new Circle();
c.draw();

let d = new Decorator(c);
d.draw();

可以看到通过装饰器方式,可以画出一个带红色边框的圆。

理解了装饰器,装饰符就大体可以理解了。

// 定义装饰器函数,该方法可以接收装饰符传递的参数
function log(type) {
    // 这是装饰符对应函数的标准接口函数。其中:target是作用的实例;name是作用的函数名;descriptor是一个标准装饰器对象,其中value是对应作用的函数。
    return function(target, name, descriptor) {
        let oldValue = descriptor.value;

        descriptor.value = function() {
            // 打印日志
            console.log(`打印日志:类型为 - ${type}`);
            // 执行原有方法
            return oldValue.apply(this, arguments);
        };

        return descriptor;
    }
}

// 使用方法
class A {
    @log("text")
    testFunc() {
        console.log("函数方法");
    }
}

let a = new A();
a.testFunc();

执行结果如下:
file

更多关于装饰符@的内容,可以看提案地址:https://github.com/tc39/proposal-decorators

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: JavaScript
最后更新:2020年5月7日

jeremyjone

这个人很懒,什么都没留下

打赏 点赞
< 上一篇
下一篇 >

文章评论

取消回复

文章目录
  • 安装babel的插件
  • 装饰符的使用
最新 热点 随机
最新 热点 随机
推一个vscode纯黑主题 vue 的递归插槽穿透 Github Pages SPA 重定向 行间距引出的 DOCTYPE 怪异行为 写个小彩蛋 绘制一个可重用的线条阴影
推一个vscode纯黑主题
IIS Express 通过IP访问的方法和坑 vue 给全局自定义属性添加 ts 类型声明 js 修改 stylus 变量 IdentityServer4深入使用(五)-- 数据持久化 [正则] 格式化数字 resharper2019.3.3最新激活方案

(っ•̀ω•́)っ✎⁾⁾ 开心每一天

COPYRIGHT © 2021 jeremyjone.com. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

京ICP备19012859号-1

京公网安备 11010802028585号