一文读懂ES7中的javascript修饰器

yizhihongxing

一文读懂ES7中的JavaScript修饰器

什么是修饰器

JavaScript修饰器是一种表达式,用于修改类的行为。修饰器通常是一个函数,接收一个类作为参数,然后返回一个包含被修饰后的类的新类。修饰器可以用来修改类的属性、方法或者整个类的行为。

在ES7中,修饰器已经成为了官方规范的一部分,被纳入了JS标准中。可以通过在类、属性或方法前面添加@修饰器名称的方式来使用修饰器。

修饰器实现

下面是一个简单的修饰器实现:

function log(target) {
  const original = target.prototype.someMethod;

  target.prototype.someMethod = function (...args) {
    console.log("before someMethod");

    const result = original.apply(this, args);

    console.log("after someMethod");

    return result;
  }

  return target;
}

@log
class MyClass {
  someMethod() {
    console.log("run someMethod");
  }
}

在上面的代码中,修饰器log接收一个类作为参数,在类中添加了一个before someMethodafter someMethod的日志打印。最终,通过将这个修饰器添加到MyClass类上,MyClass类的someMethod方法通过调用log修饰器被修改了。

修饰器示例

1. 限制类的属性的值

function range(value) {
  return function (target, key) {
    let _value = value;

    Object.defineProperty(target, key, {
      get() {
        return _value;
      },
      set(value) {
        if (value < 0) {
          _value = 0;
        }else if (value > 100) {
          _value = 100;
        }else {
          _value = value;
        }
      }
    });

    return target;
  }
}

@range(50)
class Student {
  @range(90)
  score;

  constructor(name, score) {
    this.name = name;
    this.score = score;
  }

  getName() {
    console.log(this.name);
  }

  getScore() {
    console.log(this.score);
  }
}

const student = new Student("小明", 80);

console.log(student.score); // 80
student.score = -10;
console.log(student.score); // 0
student.score = 200;
console.log(student.score); // 100

上面的代码中,我们定义了一个名为range的修饰器。这个修饰器可以用来限制类的属性的值必须在某个范围内。可以通过在类的属性前添加@range来使用这个修饰器。

Student类中,我们为score属性后使用了@range(90)修饰器,使得score属性必须在0到90之间。在Student类的构造函数中,我们创建了一个名为student的实例,并传入了一个成绩为80的学生。

最后,我们分别打印了student对象的成绩属性,并尝试将成绩设置为负数和超出90的数值,检验了@range修饰器的作用。

2. 定义路由与中间件

const routes = {};

function route(path) {
  return function (target, key, descriptor) {
    routes[path] = routes[path] || {};
    routes[path].method = "get";
    routes[path][routes[path].method] = descriptor.value;
  }
}

function middleware(m) {
  return function (target, key, descriptor) {
    const original = descriptor.value;
    descriptor.value = function () {
      const result = m();
      if (result) {
        return original.apply(this, arguments);
      }
      return "error";
    }
  }
}

class HomeController {
  @route("/")
  @middleware(() => true)
  static index() { 
    return "Hello, World!";
  }

  @route("/about")
  @middleware(() => false)
  static about() { 
    return "About us";
  }
}

console.log(routes); // { '/': { method: 'get', value: [Function: index] }, '/about': { method: 'get', value: [Function: about] } }

console.log(HomeController.index()); // Hello, World!

console.log(HomeController.about()); // error

上面的代码中,我们定义了routemiddleware两个修饰器。其中,route用于定义路由,middleware用于定义中间件。

HomeController中,我们分别使用了routemiddleware两个修饰器,定义了两个路由://about/路由的中间件返回true,所以可以正常访问,而/about的中间件返回false,所以页面输出了一个错误信息。

总结

修饰器是一项非常有用的技术,可以用于修改类的行为或者定义类的属性、方法。在ES7中正式被纳入了JS标准中,并且越来越多的框架和库也开始使用修饰器来简化代码的编写。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文读懂ES7中的javascript修饰器 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • Javascript中的匿名函数与封装介绍

    Javascript中的匿名函数与封装介绍 Javascript中的匿名函数和封装是两个非常重要的概念。使用匿名函数可以避免全局变量污染,而封装则可以保护代码,避免不必要的干扰和修改。本文将详细讲解Javascript中的匿名函数和封装,以及如何使用它们来提高你的代码质量和安全性。 匿名函数 匿名函数是Javascript中的一种特殊函数,它没有函数名,只有…

    JavaScript 2023年5月27日
    00
  • 5款Ajax 文件上传控件

    Ajax文件上传控件是很常见的一些Web技术之一,它可以使得网页用户在不刷新页面的情况下上传文件,并且可以在上传的过程中实时显示上传进度。这里我们介绍5款常见的Ajax文件上传控件。 1. AjaxUpload AjaxUpload是一种轻量级文件上传控件,代码很少,使用也非常简单,只需要用一个额外的JS文件即可。下面是一个简单的演示: new AjaxUp…

    JavaScript 2023年6月11日
    00
  • JavaScript实现随机码的生成与校验

    生成随机码的实现方法有很多种,下面我将详细讲解其中一种实现方式,包括生成随机码和校验随机码两个部分。 JavaScript实现随机码的生成 第一步 生成指定长度的随机码,这里我们选择将随机码制定为6位,可以以下面的代码实现: function generateRandomCode() { // 定义可能出现在随机码中的字符 var possible = &q…

    JavaScript 2023年5月19日
    00
  • JavaScript实现数组降维详解

    现在我会详细讲解一下“JavaScript实现数组降维详解”的完整攻略,过程中将包含两个示例。 什么是数组降维? 在 JavaScript 中,一个数组可能会包含多个层级,这时候我们可能需要将这个多维数组转换为一维数组,这个过程就被称为数组降维。 实现数组降维 在 JavaScript 语言中,我们可以使用一些方法来实现数组降维。 方法一:使用 flat()…

    JavaScript 2023年5月27日
    00
  • javascript基础知识大集锦(二) 推荐收藏

    JavaScript基础知识大集锦(二) 推荐收藏 1. 为什么要学习JavaScript基础知识 JavaScript是网页开发的基础,无论是网页的交互动画设计还是后端的Node.js开发,都离不开JavaScript。因此,学习JavaScript基础知识是每个Web开发者必不可少的一步。 2. JavaScript基础知识大集锦(二)主要内容 本篇文章…

    JavaScript 2023年5月18日
    00
  • C#基于正则去掉注释的方法示例

    下面来详细讲解“C#基于正则去掉注释的方法示例”的完整攻略。 步骤一:了解正则表达式 在进行注释去除的过程中,我们需要使用正则表达式来匹配注释并去除。因此,我们需要对正则表达式有一定的了解。 正则表达式是一种模式匹配工具,可以用来识别字符串中的特定模式,比如数字、单词、邮箱等等,具有非常强大的匹配能力。在C#中,我们可以通过System.Text.Regul…

    JavaScript 2023年6月10日
    00
  • Javascript之BOM(window对象)详解

    Javascript之BOM(window对象)详解 什么是BOM 在Web页面中,JavaScript可以调用浏览器提供的API,这些API就组成了BOM。BOM(浏览器对象模型)提供了一组对象,并且每个对象都有相关的属性和方法,可以操作浏览器窗口。BOM除了提供了访问浏览器接口的对象外,还提供了访问用户代理信息的导航对象。其中,window对象是BOM最…

    JavaScript 2023年6月11日
    00
  • JavaScript截取、切割字符串的技巧

    那么首先我们需要了解一下JavaScript中用于截取和切割字符串的几个方法。 substring(startIndex, endIndex): 截取字符串中从startIndex(包含)到endIndex(不包含)的部分,返回一个新的字符串。 substr(startIndex, length): 截取字符从startIndex(包含)开始的length个…

    JavaScript 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部