广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >详解如何在JavaScript中使用装饰器
  • 652
分享到

详解如何在JavaScript中使用装饰器

JavaScript使用装饰器JavaScript 装饰器 2022-11-13 18:11:36 652人浏览 泡泡鱼
摘要

目录安装vite配置webpack配置使用语法: @+函数名类装饰器带参数的修饰器类成员装饰器多个装饰器的执行顺序应用延迟节流防抖Decorator装饰器是ES7的时候提案的特性,目

Decorator装饰器是ES7的时候提案的特性,目前处于Stage 3候选阶段(2022年10月)。

装饰器简单来说就是修改类和类方法的语法糖,很多面向对象语言都有装饰器这一特性。

为了使用装饰器特性,我们需要用进行babel转义。这里需要用到的是@babel/plugin-proposal-decorators。

安装

npm install --save-dev @babel/plugin-proposal-decorators

vite配置

import { defineConfig } from 'vite';
import babel from 'vite-plugin-babel';

export default defineConfig({
    plugins: [
        babelDev({
            babelConfig: {
                plugin: ['@babel/plugin-proposal-decorators']
            }
        }),
        // ...
    ],

    // ...
})

WEBpack配置

module: {
  rules: [
    {
      test: /\.(js|mjs|jsx|ts|tsx)$/,
      use: {
        loader: 'babel-loader',
        options: {
          // ... 
          plugins: [
            ['@babel/plugin-proposal-decorators', { 'legacy': true }],
            // ...
          ],
          // ...
        },
      }
      // ...
    }
  ]
}  

使用

先来一图了解装饰器语法。

语法: @+函数名

@frozen
class Foo {
  @throttle(500)
  expensiveMethod() {}
}

类装饰器

参数target是类本身

function testable(target) {
  target.isTestable = true;
}

@testable
class MyTestableClass {
  // ...
}
MyTestableClass.isTestable // true

带参数的修饰器

@+返回装饰器函数的表达式

function testable(isTestable) {
  return function(target) {
    target.isTestable = isTestable;
  }
}
@testable(true)
class MyTestableClass {}
MyTestableClass.isTestable // true
@testable(false)
class MyClass {}
MyClass.isTestable // false

类成员装饰器

参数:

  • target:被修饰的类的原型对象
  • name:类成员的名字
  • descriptor:类成员的描述对象
function readonly(target, name, descriptor){
  // descriptor对象原来的值如下
  // {
  //   value: specifiedFunction,
  //   enumerable: false,
  //   configurable: true,
  //   writable: true
  // };
  descriptor.writable = false;
  return descriptor;
}

class Person {
  @readonly
  name() { return `${this.first} ${this.last}` }
}

多个装饰器的执行顺序

洋葱模型,先从外到内进入,然后由内向外执行

function dec(id){
  console.log('evaluated', id);
  return (target, property, descriptor) => console.log('executed', id);
}
class Example {
    @dec(1)
    @dec(2)
    method(){}
}
// evaluated 1
// evaluated 2
// executed 2
// executed 1

应用

延迟

class Page {
	@delay(2000)
	onClick(a) {
    console.log("onClick");
  }
}
function delay(time) {
  return function (target, key, descriptor) {
    const oldFunction = descriptor.value;
    descriptor.value = function() {
      setTimeout(() => {
        oldFunction.apply(this, arguments);
      }, time);
    }
    return descriptor;
  }
}

节流

如果在定时器的时间范围内再次触发,则不予理睬,等当前定时器完成,才能启动下一个定时器任务

class Page {
	@throttle(2000)
	onClick(a) {
    console.log("onClick");
  }
}
function throttle(time) {
  return function (target, key, descriptor) {
    const oldFunction = descriptor.value;
    let isLock = false;
    descriptor.value = function() {
      if(isLock) { return; }
     	isLock = true;
      oldFunction.apply(this, arguments);
      setTimeout(() => {
        isLock = false; 
      }, time);
    }
    return descriptor;
  }
}

防抖

每次事件触发则删除原来的定时器,建立新的定时器。

class Page {
	@debounce(2000)
	onClick(a) {
    console.log("onClick");
  }
}
function debounce(time) {
  return function (target, key, descriptor) {
    const oldFunction = descriptor.value;
    let timer = null;
    descriptor.value = function () {
      clearTimeout(timer);
      timer = setTimeout(() => {
        oldFunction.apply(this, arguments)
      }, time);
    };
    return descriptor;
  }
}

到此这篇关于详解如何在javascript中使用装饰器的文章就介绍到这了,更多相关JavaScript使用装饰器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解如何在JavaScript中使用装饰器

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

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

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

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

下载Word文档
猜你喜欢
  • 详解如何在JavaScript中使用装饰器
    目录安装vite配置webpack配置使用语法: @+函数名类装饰器带参数的修饰器类成员装饰器多个装饰器的执行顺序应用延迟节流防抖Decorator装饰器是ES7的时候提案的特性,目...
    99+
    2022-11-13
    JavaScript使用装饰器 JavaScript 装饰器
  • JavaScript 装饰器模式用法详解
    目录什么是装饰器模式为什么要有装饰器模式装饰器模式应用场景举个栗子给汽车加个真皮座椅一个简单的数据缓存总结什么是装饰器模式 装饰器模式(Decorator Pattern)是一种结构...
    99+
    2023-05-19
    JavaScript 装饰器模式 JavaScript 装饰器
  • Python装饰器中@property使用详解
    目录最初的声明方式使用装饰器的声明方式使用装饰器的调用过程总结最初的声明方式 在没有@property修饰的情况下,需要分别声明get、set、delete函数,然后初始化prope...
    99+
    2022-11-13
  • 如何在JavaScript中使用装饰者模式
    这篇文章给大家介绍如何在JavaScript中使用装饰者模式,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。JavaScript的作用是什么1、能够嵌入动态文本于HTML页面。2、对浏览器事件做出响应。3、读写HTML元...
    99+
    2023-06-14
  • Vue中使用装饰器的方法详解
    目录前言什么是装饰器?装饰器的使用js中使用装饰器不使用装饰器vue 中使用装饰器一些常用的装饰器1. 函数节流与防抖2. loading3. 确认框总结前言 相信各位在开发中一定遇...
    99+
    2022-11-13
  • 如何在Python中使用@property装饰器
    这期内容当中小编将会给大家带来有关如何在Python中使用@property装饰器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、property() 函数讲解了解 @property 装饰器之前,我们...
    99+
    2023-06-15
  • 如何在python中使用类装饰器
    这篇文章将为大家详细讲解有关如何在python中使用类装饰器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python有哪些常用库python常用的库:1.requesuts;2.scrap...
    99+
    2023-06-14
  • 如何在Python 中使用@lazyprop 装饰器
    本篇文章为大家展示了如何在Python 中使用@lazyprop 装饰器,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。安装pip install lazyprop例子1from&...
    99+
    2023-06-15
  • Python函数装饰器的使用详解
    目录装饰器装饰器的定义装饰器的意义装饰器的使用无参装饰器有参装饰器实例练习总结装饰器 装饰器的定义 关于装饰器的定义,我们先来看一段github上大佬的定义: Function de...
    99+
    2022-11-12
  • 详解Java如何优雅的使用装饰器模式
    目录什么是装饰器模式优点缺点使用场景装饰器模式和代理模式的区别装饰器的简单实现装饰器模式实战小结什么是装饰器模式 装饰器模式(Decorator Pattern): 在不改...
    99+
    2022-11-13
  • Vue中如何使用装饰器
    今天就跟大家聊聊有关Vue中如何使用装饰器,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。什么是装饰器装饰器是ES2016提出来的一个提案,当前处于S...
    99+
    2022-10-19
  • Python中如何使用装饰器?
    类方法和静态方法有点相似,他们都推荐使用类来调用(其实也可以使用对象来调用) 定义类方法 —使用@classmetho修饰(函数装饰器) —方法的第一个参数定义为cls(class的缩写),用类调用该方法时该参数会自动绑定 定义静...
    99+
    2023-01-31
    如何使用 Python
  • Python中如何理解和使用装饰器 @decorator
    Python中如何理解和使用装饰器 @decorator,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python的装饰器(decorator)是一个很棒的机制...
    99+
    2023-06-02
  • 如何使用装饰器
    本篇内容主要讲解“如何使用装饰器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用装饰器”吧!1. 常规的装饰器下面这是一个最简单的装饰器示例,在运行 myfunc 函数的前后都会打印一条日...
    99+
    2023-06-15
  • 在JavaScript中如何使用宏详解
    在语言当中,宏常见用途有实现 DSL 。通过宏,开发者可以自定义一些语言的格式,比如实现 JSX 语法。在 WASM 已经实现的今天,用其他语言来写网页其实并不是没有可能。像 Rus...
    99+
    2022-11-12
  • 详解如何利用Python装饰器优化代码
    目录什么是装饰器装饰器的应用计时器装饰器缓存装饰器类型检查装饰器日志装饰器授权装饰器拓展高阶函数包装器总结本文将带你深入探讨装饰器的应用,包括计时器装饰器和缓存装饰器等的实现。通过这...
    99+
    2023-05-19
    Python装饰器优化代码 Python装饰器优化 Python装饰器
  • Vue中的装饰器如何使用
    小编给大家分享一下Vue中的装饰器如何使用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!相信各位在开发中一定遇到过二次弹框确认相关的需求。不管你使用的是UI框架的...
    99+
    2023-06-29
  • 如何在java中使用装饰者模式
    如何在java中使用装饰者模式?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开...
    99+
    2023-06-14
  • python中的装饰器该如何使用
    目录1. 需求是怎么来的2. 以不变应万变,是变也3. 最大限度地少改动4.对带参数的函数使用装饰器5. 给装饰器参数6.带类参数的装饰器7. 对一个函数应用多个装饰器8. 作为一个类1. 需求是怎么来的 装饰器的...
    99+
    2022-06-02
    python 装饰器 python 装饰器的使用
  • Angular中如何使用方法装饰器
    这篇“Angular中如何使用方法装饰器”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“An...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作