JavaScript Decorators 的理解 和使用

  Decorators,按字面理解就是装饰器的意思。装饰的意思,我想大家都明白,就是对一个物件进行美化,让它变得更漂亮。现实的例子就是房屋装修。你买了一套房子,但是毛坯房,你肯定不想住,那就对它装饰一下,床,桌子,电视,冰箱等一通买,房子变漂亮了,住的也舒心了,同时功能也强大了,因为我们可以看电视了,上网了。

  Js中,Decorators的作用也是如此,对一个类或者其属性方法进行装饰,让它功能更加强大。语法非常简单,就是在一个类或者其属性方法前面加上@decorator,decorator 指的是装饰器的名称。装饰器本身是一个函数,因为在函数内部,我们可以进行任意的操作从而对其进行增强。

  稍微有点遗憾,现在的浏览器还没有支持它,不过我们有强大的babel, 可以利用babel进行转化, 就是配置有点麻烦,在学习之前,我们先用webpack配置一个简单的学习环境。

装饰器的转化依赖一个核心插件 babel-plugin-transform-decorators-legacy。 新建一个decorator 文件夹,npm init -y 初始化项目,安装各种依赖 npm install webpack webpack-dev-server  babel-core  babel-loader babel-plugin-transform-decorators-legacy --save-dev, 然后新建index.js 作为入口文件,index.html用于展示,webpack.config.js  配置文件 ,

  webpack.config.js  配置文件, 在babel-loader 的options中配置了transform-decorators-legacy  插件

const path = require(‘path‘);

module.exports = {
    entry: path.join(__dirname, ‘index.js‘),
    output: {
        path: path.join(__dirname),
        filename: ‘bundle.js‘
    },
    module: {
        rules: [
            {
                test: /\.js$/,
                loader: ‘babel-loader‘,
                exclude: path.join(__dirname, ‘node_modules‘),
                options: {
                    plugins: [‘transform-decorators-legacy‘]
                }
            }

        ]
    }
}

  因为webpack 打包后文件是bundle.js , 所以要在index.html 中引入 bundle.js , index.html 如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script src="bundle.js"></script>
</body>
</html>

  在index.js 中先随便写点东西,验证一个配置是否正确

document.body.innerHTML = ‘blue‘;

  在package.json文件中, scripts 字段中写入 "dev": "webpack-dev-server"

  在decorator文件夹中启动命令窗口,输入npm run dev, 可以看到项目启动成功,在浏览器中输入locolhost:8080 ,可以看到blue 表示配置成功

  环境搭建好了,我们现在可以学习decorator 及其使用了。首先 decorator是作用在class上面的,所以声明一个class,比如Car ,

class Car {

}

   其次,decorators 是一个函数,那么我们就写一个函数,直接命名为decorators 好了, 这个函数必须有一个参数,来指定它要装饰的对象,参数名一般为target

function decorators(target) {
    target.color = ‘black‘;
}

  我们给target 定义了一个属性color, 由此我们可以推断出,要装饰的类有了一个color 属性。 修饰一个类,我们就在类的上面写上装饰器 @decorators, 我们可以打印一下, 我们的猜测是不是正确的, 整个index.js 文件如下:

// 装饰器函数
function decorators(target) {
    target.color = ‘black‘;
}
// 用@装饰器 装饰一个类
@decorators
class Car {

}
console.log(Car.color);  // 输入black

  

原文地址:https://www.cnblogs.com/SamWeb/p/8387795.html

时间: 2024-10-24 09:58:13

JavaScript Decorators 的理解 和使用的相关文章

JavaScript大杂烩6 - 理解JavaScript中的this

在JavaScript开发中,this是很常用的一个关键字,但同时也是一个很容易引入bug的一个关键字,在这里我们就专门总结一下页面中可能出现的this关键字(包括几种在其他页面文件中出现的this). JavaScript中的this关键字通常只使用在函数中,它指向当前函数的调用者,这是this关键字的本质,所有的使用方式都是围绕这个展开的,让我们来看一下在各种性质的函数中this的用法.1. 在对象的函数中使用this var person = { name: 'Frank', say: f

【JavaScript】深入理解JavaScript之强大的原型和原型链

由于JavaScript是唯一一个被广泛使用的基于原型继承的语言,所以理解两种继承模式的差异是需要一定时间的,今天我们就来了解一下原型和原型链. AD: hasOwnProperty函数: hasOwnProperty是Object.prototype的一个方法,它可是个好东西,他能判断一个对象是否包含自定义属性而不是原型链上的属性,因为hasOwnProperty 是 JavaScript 中唯一一个处理属性但是不查找原型链的函数. // 修改Object.prototype Object.p

JavaScript大杂烩12 - 理解Ajax

AJAX缘由 再次谈起这个话题,我深深的记得就在前几年,AJAX被炒的如火如荼,就好像不懂AJAX,就不会Web开发一样.要理解AJAX为什么会出现,就要先了解Web开发面临的问题. 我们先来回忆一下Web页面的申请过程,这个咱们在第一篇中就介绍过了:Web页面开发就是在无连接和无状态的HTTP协议上管理页面的状态.每次申请页面的时候,服务器都会返回完整的HTML文本(当然还有其他的文本文件),浏览器就负责解析这个文本并在浏览器中显示. 在这个过程中,不管当前页面的内容是不是都变化了,服务器都会

JavaScript大杂烩7 - 理解内置集合

JavaScript内置了很多对象,简单的类型如String,Number,Boolean (相应的"值类型"拥有相同的方法),复杂一点的如Function,Object,Array,它们支撑起来JavaScript编程的基石.由于Number与Boolean很简单,这里就不多说了,下面着重介绍其他的内置对象. 万物之源 - Object对象 JavaScript是单根的,唯一的根就是Object对象,这个对象提供了几个还是不错的方法,值得了解一下. 1. hasOwnProperty

JavaScript大杂烩8 - 理解文本解析的"黄金搭档"

文本解析"黄金搭档" - String与RegExp对象 文本解析是任何语言中最常用的功能,JavaScript中也是一样,而正则表达式作为最常用的方式,JavaScript也同样是支持的,下面就来看看字符串对象与正则表达式对象的配合. 字符串的恒定性 在正式开始讨论字符串对象的成员之前,我们需要了解一点,那就是:与C#一样,JavaScript 的字符串是不可变的(immutable),String对象定义的方法都不会改变字符串的内容.像toUpperCase这样的方法,返回的是全新

[JavaScript原型继承理解一]

转:http://www.cnblogs.com/harolei/p/3740354.html 对于JavaScript的继承和原型链,虽然之前自己看了书也听了session,但还是一直觉得云里雾里,不禁感叹JavaScript真是一门神奇的语言.这次经过Sponsor的一对一辅导和自己回来后反复思考,总算觉得把其中的精妙领悟一二了. 1. JavaScript创建对象 在面向对象语言中,通常通过定义类然后再进行实例化来创建多个具有相同属性和方法的对象.但是在JavaScript中并没有类的概念

JavaScript大杂烩9 - 理解BOM

毫无疑问,我们学习JavaScript是为了完成特定的功能.在最初的JavaScript类型系统中,我们已经分析过JavaScript在页面开发中充当着添加逻辑的角色,而且我们知道JavaScript不仅仅包含基本的语法规范.下面我们就重点看一下JavaScript在页面中干的那些事.总的来说,JavaScript在页面端就干两件事:操作DOM与操作BOM (当然了向Server获取数据也是它的工作,不过获取到数据后还是回来干这两件事,大家对JavaScript最直接的印象应该就是各种光怪陆离的

JS javascript面向对象的理解及简单的示例

javascript面向对象的理解及简单的示例 一. javascript面向对象概念: 为了说明 JavaScript 是一门彻底的面向对象的语言,首先有必要从面向对象的概念着手 , 探讨一下面向对象中的几个概念: 1.一切事物皆对象 2.对象具有封装和继承特性 3.对象与对象之间使用消息通信,各自存在信息隐藏 以这三点做为依据,C++ 是半面向对象半面向过程语言,因为,虽然他实现了类的封装.继承和多态,但存在非对象性质的全局函数和变量.Java.C# 是完全的面向对象语言,它们通过类的形式组

对javascript this的理解

对于this的理解,大部分时间都比较模糊,最近几天做了一些研究,记录一下 首先应该明白,this是执行上下文的一个属性,它的值取决于执行上下文,执行上下文和函数调用方式相关,定义一个function的时候会激活一个上下文,关于上下文的介绍,参考<对javascript执行上下文的理解>一文. this的几种使用场景: 一 .全局代码中的this 在全局的上下文中,this始终是全局对象本身,看代码: this.a = 10; alert(window.a);//10 b = 20; alert