搜索
首页web前端前端问答修饰器是es6还是es7的特性

修饰器是es6还是es7的特性

Apr 13, 2022 pm 02:52 PM
es6es7修饰器

修饰器是es7特性。修饰器是ES7引入的一种与类相关的语法,用来注释或修改类和类的方法,依赖于ES5的“Object.defineProperty”方法,写法为“@函数名”;它可以注入到类、方法、属性参数上来扩展类、属性、方法、参数的功能。

修饰器是es6还是es7的特性

本教程操作环境: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中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
CSS IDS vs类:哪个更适合可访问性?CSS IDS vs类:哪个更适合可访问性?May 10, 2025 am 12:02 AM

classebetterforaccoctibalyinwebdevelopment.1)classCanbeAppliedTomultiplelements,可确保ConsistentStentStyleSandLeSandBehaviors,woaidsuserserswithdisabilities.2)heSfacilitateTatheefariaTheeofariaAttributesCrossCroscrosproupscroscrosproupSoflementsperementsperients.3)

CSS:了解类和ID选择器之间的区别CSS:了解类和ID选择器之间的区别May 09, 2025 pm 06:13 PM

classSelectorSareReusable -ableFormultIlts,wheridSelectorSareectorSareEniqueAnduseNceperPage.1)class,deotedByDoperiod(。),areidealforStyealForStylingMultilestIllementsLikeButtons.2)IDS,DENOTEDBYBYAHASH(#),ASEPERFECTFORECTFORECTFORECTFORECTORFECTFOFECTFORUNICELELENSLIEMENTLIEMELLEMELLELEMENLELIKEANAVICEANAVICENU.3)

CSS样式:在类和ID选择器之间进行选择CSS样式:在类和ID选择器之间进行选择May 09, 2025 pm 06:09 PM

在CSS样式中,应根据项目需求选择类选择器或ID选择器:1)类选择器适合重复使用,适用于多个元素的相同样式;2)ID选择器适用于唯一元素,具有更高优先级,但应谨慎使用以避免维护困难。

HTML5:限制HTML5:限制May 09, 2025 pm 05:57 PM

HTML5hasseverallimitationsincludinglackofsupportforadvancedgraphics,basicformvalidation,cross-browsercompatibilityissues,performanceimpacts,andsecurityconcerns.1)Forcomplexgraphics,HTML5'scanvasisinsufficient,requiringlibrarieslikeWebGLorThree.js.2)I

CSS:一种样式比另一种样式更优先吗?CSS:一种样式比另一种样式更优先吗?May 09, 2025 pm 05:33 PM

是的,onestylecanhavemoreproritythanananthanincsssduetospecificityandthecascade.1)excascadedEteDeteTerminessTyLeaepplicationPlicationPlicationPlicationPlicationPlicationPlicationPlicationPlicationErplicationPlicationErplicationPlicationPlicationErplicationPlicationErplicationPlicatification pressorderorder- platerrulesoverrulesoverresofequearleseareSofealSoficificiiiiiiiiiiiiiiiiiiiiiiiiii

HTML5规范的重要目标是什么?HTML5规范的重要目标是什么?May 09, 2025 pm 05:25 PM

thtml5 aretoenhancemultimultimeDiasupport,susehumanantability,susehumantability ofhtmllagalsemantability.1)

反应的局限性是什么?反应的局限性是什么?May 02, 2025 am 12:26 AM

Include:1)AsteeplearningCurvedUetoItsVasteCosystem,2)SeochallengesWithClient-SiderEndering,3)潜在的PersperformanceissuesInsuesInlArgeApplications,4)ComplexStateStateManagementAsappsgrow和5)TheneedtokeEedtokeEedtokeEppwithitsrapideDrapidevoltolution.thereedtokeEppectortorservolution.thereedthersrapidevolution.ththesefactorsshesssheou

React的学习曲线:新开发人员的挑战React的学习曲线:新开发人员的挑战May 02, 2025 am 12:24 AM

reactischallengingforbeginnersduetoitssteplearningcurveandparadigmshifttocoment oparchitecent.1)startwithofficialdocumentationforasolidFoundation.2)了解jsxandhowtoembedjavascriptwithinit.3)

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

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

热工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用