iis服务器助手广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >修饰器是es7的特性吗
  • 876
分享到

修饰器是es7的特性吗

2024-04-02 19:04:59 876人浏览 独家记忆
摘要

本文小编为大家详细介绍“修饰器是es7的特性吗”,内容详细,步骤清晰,细节处理妥当,希望这篇“修饰器是es7的特性吗”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

本文小编为大家详细介绍“修饰器是es7的特性吗”,内容详细,步骤清晰,细节处理妥当,希望这篇“修饰器是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):在控制台显示一条警告,表示该方法将废除。

读到这里,这篇“修饰器是es7的特性吗”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网node.js频道。

--结束END--

本文标题: 修饰器是es7的特性吗

本文链接: https://www.lsjlt.com/news/97299.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 修饰器是es7的特性吗
    本文小编为大家详细介绍“修饰器是es7的特性吗”,内容详细,步骤清晰,细节处理妥当,希望这篇“修饰器是es7的特性吗”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 ...
    99+
    2024-04-02
  • await是es7的吗
    本文小编为大家详细介绍“await是es7的吗”,内容详细,步骤清晰,细节处理妥当,希望这篇“await是es7的吗”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。await是es7。async和await是ES7...
    99+
    2023-07-04
  • async是es7的吗
    这篇文章主要介绍“async是es7的吗”,在日常操作中,相信很多人在async是es7的吗问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”async是es7的吗”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-07-05
  • class是es6的新特性吗
    这篇文章主要讲解了“class是es6的新特性吗”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“class是es6的新特性吗”吧!class是es6新特性。在ES6中,class(类)作为对象...
    99+
    2023-07-04
  • es6修饰器的作用是什么
    这篇文章主要讲解了“es6修饰器的作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“es6修饰器的作用是什么”吧!在es6中,修饰器用来注释或修改类和类的方法,依赖于ES5的“Obje...
    99+
    2023-07-05
  • 语义化是html5新特性吗
    小编给大家分享一下语义化是html5新特性吗,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 语义化是...
    99+
    2024-04-02
  • 单线程是go语言的特性吗
    单线程不是go语言的特性,go语言是多线程的。Golang的线程模型是MPG模型,整体上Go程与内核线程是多对多对应的,因此Go一定是多线程模式的;其中M与内核线程是1比1对应,然后多个G与多个M对应,P指的是上下文资源。本教程操作环境:w...
    99+
    2023-05-14
    go语言 Golang
  • python中修饰器的作用是什么
    今天就跟大家聊聊有关python中修饰器的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。python有哪些常用库python常用的库:1.requesuts;2.scrap...
    99+
    2023-06-14
  • es6 修饰器是干什么用
    本教程操作环境:windows7系统、ECMAScript 6版、Dell G3电脑。修饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的...
    99+
    2023-05-14
    修饰器 javascript ES6
  • Flask中特殊装饰器的使用
    (1)@app.before_request 请求到达视图函数之前,进行自定义操作,类似django中间件中的process_request,在app中使用则为全局,在蓝图中使用则针...
    99+
    2023-02-24
    Flask 特殊装饰器
  • Java中static修饰的静态变量、方法及代码块的特性与使用
     前言 static关键字表示“静态的”,可以用来修饰类的变量、成员方法和代码块等。 被其修饰的类成员具有一些特殊性,下面将介绍static所修饰的...
    99+
    2023-05-16
    Java static static修饰符
  • PHP权限控制修饰符解析:深入剖析各种修饰符的特点和作用
    在Web应用开发中,权限控制是非常重要的一项功能,尤其是在应用中涉及到用户身份验证和对敏感信息的保护时。在PHP中,权限控制修饰符是一种常见的用于控制类、属性和方法访问权限的工具。本文将深入剖析PHP中各种权限控制修饰符的特点和...
    99+
    2024-01-19
    PHP 权限控制 修饰符
  • 怎么在python中修饰带参数的装饰器
    本篇文章给大家分享的是有关怎么在python中修饰带参数的装饰器,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python的五大特点是什么python的五大特点:1.简单易学,...
    99+
    2023-06-14
  • JS属性的特性是什么
    这篇文章将为大家详细讲解有关JS属性的特性是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。概念ECMAScript 5 中定义了一个名叫“属性描述符”的...
    99+
    2024-04-02
  • Flask中的特殊装饰器如何使用
    这篇“Flask中的特殊装饰器如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Flask中的特殊装饰器如何使用”文章吧...
    99+
    2023-07-05
  • 云服务器的性能特点是
    云服务器的性能特点包括以下几个方面: 高可用性:云服务器可以通过多节点并行处理大量数据,提供高可用性的支持,从而在业务连续性、灾难恢复等方面发挥重要作用。 快速响应:云服务器的响应速度非常快,可以在短时间内将请求分配到高性能计算节点上。...
    99+
    2023-10-27
    性能 服务器 特点是
  • C++的继承特性你了解吗
    目录导语:继承作用继承的结果继承方式子类构造赋值兼容规则/向上转换/内存切片多继承虚拟继承总结导语: C++是对C语言的优化和改进,C++之所以优秀的点在于它的特性:抽象、封装、继承...
    99+
    2024-04-02
  • C#中Static修饰的作用是什么
    这篇文章将为大家详细讲解有关C#中Static修饰的作用是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.类的静态成员:classA  {  p...
    99+
    2023-06-18
  • es6中static修饰符指的是什么
    这篇“es6中static修饰符指的是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“e...
    99+
    2024-04-02
  • Python的特性是什么
    本篇内容主要讲解“Python的特性是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python的特性是什么”吧!我们***从最难的问题开始:“到底什么是函数编程 (FP)?”一个答案可能会...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作