ES6 新特性梳理系列丨修饰器 Decorator

ES6 新特性梳理系列文章将在本号持续发布,一起查漏补缺学个痛快!若您有遇到其它相关问题,非常欢迎在评论中留言讨论,达到帮助更多人的目的。若感本文对您有所帮助请点个赞吧!


JavaScript 与 ECMAScript

JavaScript 诞生于1995年,设计者是就职于 Netscape 公司的工程师 Brendan Eich。它是一门仅用10天就完成设计的编程语言,但至今为止已对业界保持26年的影响,且势头愈发强劲

1996年 Netscape 将 JavaScript 提交给ECMA,希望它可以成为“标准化一个通用的、跨平台的、中立于厂商的脚本语言的语法和语义标准”,1997年 ECMA 确定将 JavaScript 作为浏览器脚本语言的标准,并为之重命名为 ECMAScript,所以通常来讲我们将 ECMAScript 视为 JavaScript 的标准,而 JavaScript 则是 ECMAScript 的实现及扩展

1997年-1999年连续发布了ES1-ES3发布,2000年开始酝酿新版本的升级内容,中间因标准委员会意见未能达成一致,只做了部分功能的小范围升级及支持,于2009年12月发布了过渡版 ECMAScript 5.0,2011年6月发布 ECMAScript 5.1 并成为 ISO 国际标准

2013年3月 ECMAScript 6 草案冻结,2013年12月 ECMAScript 草案发布,2015年6月 ECMAScript 6 正式通过,成为新的国际标准。ES6 泛指自2015年升级为 ECMAScript 6.0 后的所有子版本,如:ES2015-ES2020,等同于ES6.0-ES6.5,这是 JavaScript 走向企业级编程语言的强势升级

不断升级的标准与实现,对于开发效率及产品质量起到强有力的支撑,接下来我们开始梳理ES6的新特性吧!


什么是修饰器

修饰器其实就是一个普通的函数,用来修饰类或者类的方法。执行阶段是在编译阶段,相当于你在执行类的时候,中间插了一脚,执行了修饰器的内容,我们可以用他来定义访问权限,输出日志等。


修饰类

// 定义一个修饰器
function test(target){
  target.a = 1
}


@test
class TestClass {}


console.log(TestClass.a)  // 1

上方代码里的 @test 就是一个修饰器,为 TestClass 类加上一个静态属性a,值为1。

修饰器函数接收的第一个参数就是所要修饰的目标类,以上是为类添加一个静态属性,我们也可以通过原型链形式,为类添加一个实例属性。

// 定义一个修饰器
function test(target){
  target.prototype.b = 2
}


@test
class TestClass {}
let t = new TestClass
console.log(t.b)  // 2

方法的修饰

修饰器可以用来修饰类中的方法,比如:

class Person {
  @readonly
  getName() { 
    return '1234'
  }
}


function readonly(target, name, descriptor){
    descriptor.writable = false;
    return descriptor;
}

此时,修饰器函数一共可以接受三个参数,第一个参数是所要修饰的目标对象,第二个参数是所要修饰的属性名,第三个参数是该属性的属性描述符。

上方代码中,我们修改了 getName 的属性描述符为不可写,也就是 getName 是只读的,用户不可写。

当前修饰器的效果等价于:

Object.defineProperty(Person.prototype, '属性名', {
  value:"<属性值>",
  writable: false,
});

修饰器不可用于函数

修饰器只能用于类和类的方法,不能用于函数,因为存在函数提升。

var count = 0;
var add = function () {
  count++;
};
@add
function foo() {
}

上方代码,如果不发送变量提升的话,最终结果 count 的值会是1,但是因为发生了变量提升,导致最终结果是0。最终真正的执行顺序是这样的:

var count;
var add;
@add
function foo() {
}
count = 0;
add = function () {
  count++;
};
console.log(count)

上方代码在进行 babel 转换时,会报错:Leading decorators must be attached to a class declaration.

有关变量提升的详细介绍,请移步ES6 新特性梳理系列丨Var + Let + Const 的区别与作用域


ES6 新特性梳理系列文章将在本号持续发布,一起查漏补缺学个痛快!若您有遇到其它相关问题,非常欢迎在评论中留言讨论,达到帮助更多人的目的。若感本文对您有所帮助请点个赞吧!

叶阳辉

HFun 前端攻城狮

往期精彩:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值