一文读懂ES7中的javascript修饰器

一文读懂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)
上一篇 4天前
下一篇 4天前

相关文章

  • javascript实现数组最大值和最小值的6种方法

    JavaScript实现数组最大值和最小值的6种方法 在JavaScript中,我们经常需要在数组中查找最大值和最小值。本文将介绍6种用JavaScript实现数组最大值和最小值的方法。 1. Math.max()和Math.min() 我们可以使用Math对象的max()和min()方法查找数组中的最大值和最小值。 let arr = [1, 2, 3, …

    JavaScript 4天前
    00
  • 12 款 JS 代码测试必备工具(翻译)

    首先,这篇文章主要介绍了12款JS代码测试必备工具,包括Jest、Mocha、Chai、Sinon、Enzyme、Cypress、Protractor、Karma、Nightwatch.js、Puppeteer、TestCafe和Codeceptjs。这些工具可以帮助开发者提高代码质量和测试效率。 以下是这些工具的详细介绍: Jest:Jest是一个建立在J…

    JavaScript 4天前
    00
  • js前端面试之同步与异步问题详解

    JS前端面试之同步与异步问题详解攻略 1. 同步与异步的概念 同步和异步都是指程序的执行方式,它们的区别在于程序执行完成的时间点不同。同步是指代码按照顺序一行一行地执行,需要等待前面的代码执行完成后才会执行后面的代码。而异步则是指代码不需要按照顺序执行,可以在后台继续执行其他代码,当前面的代码执行完成后再回来执行后面的代码。 2. 同步与异步的应用场景 同步…

    JavaScript 3天前
    00
  • JS实现字符串转驼峰格式的方法

    JS实现字符串转驼峰格式的方法,可以通过使用正则表达式和replace方法来实现。下面是一个完整的攻略: 使用正则表达式和replace方法实现 步骤如下: 通过正则表达式匹配所有需要转换为驼峰格式的字符串。 javascript/[-_]\w/g [-_]表示要匹配的分隔符可以是 – 或 _ ,方括号[]表示单字符匹配 \w表示匹配任何字母数字字符,等价于…

    JavaScript 3天前
    00
  • javascript遍历json对象的key和任意js对象属性实例

    我们来详细讲解JavaScript如何遍历JSON对象的key和任意JS对象属性实例。 遍历JSON对象的key 在JavaScript中,我们可以使用for-in循环来遍历JSON对象的key。示例如下: const obj = {name: ‘张三’, age: 20, gender: ‘男’}; for (let key in obj) { conso…

    JavaScript 4天前
    00
  • JavaScript的级联函数用法简单示例【链式调用】

    JavaScript的级联函数用法简单示例【链式调用】 级联调用也叫做链式调用,是一种在调用同一个对象的多个方法时可以省略中间变量的写法。这种写法在JavaScript中非常常见,例如jQuery的链式调用,可以让我们在一个语句中同时执行多个方法。 基本概念 所谓级联调用,就是一连串调用同一个对象的方法。在链式调用中,每个方法都返回对象本身,使得下一个方法可…

    JavaScript 4天前
    00
  • JavaScript中5个常用的对象

    当我在学习JavaScript时,我发现其中的Object类型有很多种,有些我根本没有听说过。经过深入研究后,我总结了JavaScript中最常用的5个对象类型,并在下面进行了详细解释和示例说明。 1. Array对象 数组对象是JavaScript中最常用的一个类型。它允许我们将数据存储在一个变量中,并按索引号访问每个数据,它还提供了很多有用的方法和属性,…

    JavaScript 4天前
    00
  • JS判断数组那点事

    JS判断数组那点事:完整攻略 在JavaScript中,我们可以使用各种方式来判断一个变量是否为数组。本攻略将介绍一些常用的方法以及它们的优缺点。 1. 使用typeof运算符 我们可以使用typeof运算符来获取变量的数据类型。对于数组而言,typeof将返回”object”。因此可以使用typeof判断传入的参数是否为”object”,如果是则继续判断是…

    JavaScript 4天前
    00
  • JavaScript关于数组的四道面试题

    以下是JavaScript关于数组的四道面试题的详细攻略: 面试题一:如何将数组扁平化? 问题描述 给定一个多维数组,如何将其转为一维数组,即扁平化? 解决方案 我们可以使用ES6的 flat 方法,该方法接收一个可选参数depth,指定展开的深度。当不传depth时,默认展开所有层级。 同时,为了兼容性,我们也可以使用递归实现深度优先的扁平化。 示例代码如…

    JavaScript 4天前
    00
  • JavaScript数组去重的几种方法

    JavaScript中的数组去重是一个比较常用的操作,本文将介绍几种常用的JavaScript数组去重方法,包括传统for循环、ES6 Set、Array.filter()、Array.reduce()和ES6 Map。 传统for循环 最常见的去重方法就是使用传统的for循环,基本思路是:遍历数组,将每一个元素与数组的其它元素进行比较,如果有重复的就将其删…

    JavaScript 4天前
    00