修饰器是es6还是es7的特性
修饰器是es7特性。修饰器是ES7引入的一种与类相关的语法,用来注释或修改类和类的方法,依赖于ES5的“Object.defineProperty”方法,写法为“@函数名”;它可以注入到类、方法、属性参数上来扩展类、属性、方法、参数的功能。
本教程操作环境:windows7系统、ECMAScript 7版、Dell G3电脑。
什么是修饰器
修饰器(Decorator)是ES7的一个语法,是一种与类相关的语法,用来注释或修改类和类的方法。
它的出现能解决两个问题:
不同类间共享方法
编译期对类和方法的行为进行改变
修饰器一个包裹函数,写成 @函数名
。它可以放在类和类方法的定义前面,可以用来为类、属性或者函数提供额外的功能。
@frozen class Foo { @configurable(false) @enumerable(true) method() {} @throttle(500) expensiveMethod() {} }
上面一共用了四个装饰器,一个用在类本身,另外三个用在类方法。
修饰器(Decorator) 也并不是一个新的概念,其他语言比如 Java,Python等已经很早就有了,ES7中的装饰器(Decorator)借鉴了其他语言的写法,不过依赖于ES5的Object.defineProperty 方法 。
类的修饰
@testable class MyTestableClass { // ... } function testable(target) { target.isTestable = true; } MyTestableClass.isTestable // true
@testable就是一个装饰器,它修改了MyTestableClass这个类的行为,为它加上了静态属性isTestable。testable函数的参数target是MyTestableClass类本身。
@decorator class A {} // 等同于 class A {} A = decorator(A) || A;
也就是说,装饰器是一个对类进行处理的函数。装饰器函数的第一个参数,就是所要装饰的目标类。
如果想实现添加多个参数的功能,可以在装饰器外面再封装一层函数。
function testable(name) { return function(target) { target.name = name; } } @testable('MyTestableClass') class MyTestableClass {} MyTestableClass.name // MyTestableClass @testable('MyClass') class MyClass {} MyClass.isTestable // MyClassf
上面例子是给类添加一个静态属性。
如果想添加实例属性,可以通过目标类的 Prototype对象操作。
export function mixins(...list) { return function (target) { Object.assign(target.prototype, ...list) } } // main.js import { mixins } from './mixins' const Foo = { foo() { console.log('foo') } }; @mixins(Foo) class MyClass {} let obj = new MyClass(); obj.foo() // 'foo'
实际开发中,react 与 Redux 库结合使用时,常常需要写成下面这样。
class MyreactComponent extends React.Component {}; export default connect(mapStateToProps, mapDispatchToProps)(MyReactComponent);
有了装饰器,就可以改写上面的代码。
@connect(mapStateToProps, mapDispatchToProps) export default class MyReactComponent extends React.Component {};
注意,装饰器对类的行为的改变,是 代码编译时发生的,而不是在运行时。这意味着,装饰器能在编译阶段运行代码。也就是说,装饰器本质就是编译时执行的函数。
方法的修饰
class Person { // 用来装饰”类“的 name 方法 @readonly name() { return `${this.first} ${this.last}` } }
装饰器函数readonly一共可以接受三个参数。
function readonly(target, name, descriptor){ // descriptor对象原来的值如下 // { // value: specifiedFunction, // enumerable: false, // configurable: true, // writable: true // }; descriptor.writable = false; return descriptor; } readonly(Person.prototype, 'name', descriptor); // 类似于 Object.defineProperty(Person.prototype, 'name', descriptor);
- 装饰器第一个参数是类的原型对象,上例是Person.prototype,装饰器的本意是要“装饰”类的实例,但是这个时候实例还没生成,所以只能去装饰原型(这不同于类的装饰,那种情况时target参数指的是类本身)
- 第二个参数是所要装饰的属性名
- 第三个参数是该属性的描述对象
装饰器还有注释的作用,比如上面我们可以一眼看出上面 name的方法是只读的。
除了注释,装饰器还能用来类型检查。所以,对于类来说,这项功能相当有用。从长期来看,它将是 JavaScript 代码静态分析的重要工具。在TypeScript里已做为一项实验性特性予以支持。
为什么装饰器不能用于函数
装饰器只能用于类和类的方法,不能用于函数,因为存在函数提升。
var counter = 0; var add = function () { counter++; }; @add function foo() {}
上面的代码,意图是执行后counter等于 1,但是实际上结果是counter等于 0。因为函数提升,使得实际执行的代码是下面这样。
@add function foo() { } var counter; var add; counter = 0; add = function () { counter++; };
总之,由于存在函数提升,使得装饰器不能用于函数。类是不会提升的,所以就没有这方面的问题。
core-decorators.js
[core-decorators.js]()是一个第三方模块,提供了几个常见的装饰器。
- @autobind:使得方法中的this对象,绑定原始对象
- @readonly:使得属性或方法不可写。
- @override:检查子类的方法,是否正确覆盖了父类的同名方法,如果不正确会报错。
- @deprecate (别名@deprecated):在控制台显示一条警告,表示该方法将废除。
【相关推荐:javascript视频教程、web前端】
以上是修饰器是es6还是es7的特性的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

在ES6中,可以利用数组对象的reverse()方法来实现数组反转,该方法用于颠倒数组中元素的顺序,将最后一个元素放在第一位,而第一个元素放在最后,语法“array.reverse()”。reverse()方法会修改原始数组,如果不想修改需要配合扩展运算符“...”使用,语法“[...array].reverse()”。

async是es7的。async和await是ES7中新增内容,是对于异步操作的解决方案;async/await可以说是co模块和生成器函数的语法糖,用更加清晰的语义解决js异步代码。async顾名思义是“异步”的意思,async用于声明一个函数是异步的;async和await有一个严格规定,两者都离不开对方,且await只能写在async函数中。

为了浏览器兼容。ES6作为JS的新规范,加入了很多新的语法和API,但现代浏览器对ES6新特性支持度不高,所以需将ES6代码转为ES5代码。在微信web开发者工具中,会默认使用babel将开发者ES6语法代码转换为三端都能很好支持的ES5的代码,帮助开发者解决环境不同所带来的开发问题;只需要在项目中配置勾选好“ES6转ES5”选项即可。

步骤:1、将两个数组分别转为set类型,语法“newA=new Set(a);newB=new Set(b);”;2、利用has()和filter()求差集,语法“new Set([...newA].filter(x =>!newB.has(x)))”,差集元素会被包含在一个set集合中返回;3、利用Array.from将集合转为数组类型,语法“Array.from(集合)”。

在es6中,暂时性死区是一个语法错误,是指let和const命令使区块形成封闭的作用域。在代码块内,使用let/const命令声明变量之前,该变量都是不可用的,在变量声明之前属于该变量的“死区”;这在语法上,称为“暂时性死区”。ES6规定暂时性死区和let、const语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。

不是,require是CommonJS规范的模块化语法;而es6规范的模块化语法是import。require是运行时加载,import是编译时加载;require可以写在代码的任意位置,import只能写在文件的最顶端且不可在条件语句或函数作用域中使用;require运行时才引入模块的属性所以性能相对较低,import编译时引入模块的属性所所以性能稍高。

在es6中,可以利用array对象的length属性来判断数组里总共有多少项,即获取数组中元素的个数;该属性可返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。
