6.28学习 babel转换,es6的装饰器

news2024/11/24 3:57:59

6.28学习 babel转换,es6的装饰器

  • 1.babel转换
    • 1.1出现问题
    • 1.2babel转换
  • 2.装饰器
    • 2.1类装饰器
    • 2.2方法装饰器

1.babel转换

1.1出现问题

先来一段代码,运行,有可能是会报错的,为什么呢?因为JS以前只能运行在浏览器中,Node.js 出现之后,不管是服务器上,还是我们自己的的笔记本上,只要安装了 Node.js 就可以运行 JS 代码了。所以是node帮我们运行了代码的。
有可能报错的原因是node的版本很多,这种很新的语法可能在低版本的node版本是不支持的。

class Animal{
   static flag = '哺乳类';
   constructor(){
      this.name = 'XXX'
   }
   say(){
      console.log('say')
   }
}
let animal1 = new Animal();
console.log(animal1,Animal.flag)
animal1.say()

目前我的node版本是14.15.1,是可以支持的
在这里插入图片描述
但是我把node的版本降为8.17.0的话,就会报错的
在这里插入图片描述
我们下面就以8.17.0的版本演示下面的内容。

1.2babel转换

如果版本不支持的话,我们就可以用babel/将我们的高级代码(es7等)转换为es5代码。这里就要装一个包babel-cli。但是babel-cli是以前的写法了,现在一般是@babel/cli。执行命令:

npm init  npm install @babel/cli --dev

安装后会发现在node_modules目录下多一个.bin目录
在这里插入图片描述
这里再引入一个 npx命令,它是node5.2版本以上会提供的,帮我们执行node_modules/.bin目录下的文件。那我们执行下 npx babel试一下
在这里插入图片描述
看到报错了,未找到@babel/core模块。那我们再npm install @babel/core --dev把它装上后再试一下npx babel
在这里插入图片描述
还是报错,语法不对这里是。要告诉它编译的是哪个文件和编译后要变成什么文件。
在这里插入图片描述
会发现确实目录下多了个编译后的文件,我这里是es5.js。但是打开一看发现,跟原来编译前的代码一摸一样!!!那不是没编译嘛。
其实是 @babel/core只做转换的动作,但是你还需要告诉它转换的规则是什么。这里就要在你项目的最外层,和node_modules同级目录建一个.babelrc文件。
我们下载包@babel/preset-env,并且在.babelrc中配置

{
   "presets": ["@babel/preset-env"],
   "plugins": []
}

然后再执行我们的npx命令(我的是npx babel .\index.js -o ./es5.js),发现编译出来的文件不一样了!!!

在这里插入图片描述
再运行
在这里插入图片描述
但是这个@babel/preset-env包也只能转换已定案的语法,像更高级的语法,例如装饰器,static xxx = 'xx’等还是无法转译的。
@babel/plugin-proposal-class-properties 这个包就是用来转换static xxx = ‘xx’(类的属性的) 不支持的话可以安装。
其实npx的执行顺序可以看作 @babel/cli ==> @babel/core ==> 转换(读取.babelrc中的配置)

2.装饰器

2.1类装饰器

装饰器写在类外面的是类装饰器

//装饰器 mobx nest vue 
//装饰器可以修饰 类的属性 类的原型上的方法
//修饰的时候就是把这个类 属性... 传递给修饰的函数
@flag
class Animal{
   // static flag = '哺乳类';
   name = 'XXX'
   say(){
      console.log('say')
   }
}

function flag(Constructor){
   Constructor.type = '哺乳类'
}
console.log(Animal.flag)

类装饰器有个参数,就是会被装饰的类
这里执行npx命令就会报错
在这里插入图片描述
他还给了提示,那我们就把@babel/plugin-proposal-decorators装上,并且在.babelrc中配置

{
   "presets": ["@babel/preset-env"],
   "plugins": ["@babel/plugin-proposal-decorators"]
}

再来npx,还是报错。。。
在这里插入图片描述
,babelrc配置写错了

{
   "presets": ["@babel/preset-env"],
   "plugins": [
      ["@babel/plugin-proposal-decorators", { "legacy": true }]
   ]
}

再npx可以的了
上面的装饰器是可以传参的,例如

@flag('哺乳类')
function flag(value){
   return function (Constructor) {
      Constructor.type = value
   }
}

其实@flag可以看成个语法糖

@@flag('哺乳类')
flag('哺乳类')(Animal)
function flag(value){
   return function (Constructor) {
      Constructor.type = value
   }
}

2.2方法装饰器

写在类里面的装饰器就是方法装饰器,他有三个参数的。第一个参数是类的原型对象,上例是Animal.prototype,装饰器的本意是要“装饰”类的实例,但是这个时候实例还没生成,所以只能去装饰原型(这不同于类的装饰,那种情况时target参数指的是类本身);第二个参数是所要装饰的属性名,第三个参数是该属性的描述对象。

@flag
class Animal{
   // static flag = '哺乳类';
   @readonly
   name = 'XXX'
   say(){
      console.log('say')
   }
}

function flag(Constructor){
   Constructor.type = '哺乳类'
}
console.log(Animal.type)

//直接编译会出错的 npx babel .\class-decorator.js -o es5.js

//1)类的静态属性

//2)类的属性(实例上的属性)

// function readonly() {
//    console.log(arguments)//有三个参数 Animal的实例 属性 配置项({
  configurable: true,
  enumerable: true,
  writable: true,
  initializer: [Function: initializer]
})
// }
function readonly(target,property,descriptor) {
   console.log(target == Animal.prototype)
}

所以把这段代码编译后执行会报错,
在这里插入图片描述
因为这个时候实例还没生成,这样写就不会报错

  setTimeout(function () {
    console.log(target == Animal.prototype);
  });

方法装饰器可以修改属性的描述对象(descriptor),然后被修改的描述对象再用来定义属性。
我们在方法前面定义一个装饰器,它的第三个参数是不一样的

//装饰器 mobx nest vue 
//装饰器可以修饰 类的属性 类的原型上的方法
//修饰的时候就是把这个类 属性... 传递给修饰的函数
@flag
class Animal{
   // static flag = '哺乳类';
   @readonly
   name = 'XXX'
   @before
   say(){
      console.log('say')
   }
}

function flag(Constructor){
   Constructor.type = '哺乳类'
}
console.log(Animal.type)
function readonly(target,property,descriptor) {
   setTimeout(() => {
      console.log(target == Animal.prototype)
      console.log(descriptor)
   });
   
}

function before(target,property,descriptor) {
   console.log(descriptor)
}

在这里插入图片描述
可以写一些逻辑代码,例如切片

function before(target,property,descriptor) {
   console.log(descriptor)
   let oldSay = descriptor.value;
   descriptor.value = function () {
      console.log('before')
      oldSay.call(target)
   }
}

let animal = new Animal()
animal.say()

结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/702095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Bokeh 绘图基础与常用功能

Reference | Getting started with Bokeh – Medium Post 在 Github 上查看交互式的绘图结果 | Bokeh 绘图入门 – Posted by Paradise 在这篇文章中,从最基本的绘图开始,逐步学习 Bokeh 中常用的绘图功能,目标是能满足大部分基础的绘图需求。…

密码学—Vigenere加密Python程序

文章目录 维吉尼亚加密加密算法解密算法 注意事项 维吉尼亚加密 古典密码,属于多表加密。 怎么就是多表了? 维吉尼亚密码的加密算法实质是凯撒密码,因为他是先分好小组,然后用密钥串对应着分好组的每一个字母进行加密&#xff08…

用纯CSS和DIV绘制播放按钮样式

最近在做前端的视屏监控播放对接&#xff0c;前端弄了个播放按钮&#xff0c;记录下&#xff0c;效果如图所示&#xff1a; HTML代码&#xff1a; <div className"box"><div className"one" ><div className"two"><div cl…

1.1、Java初级认识Java、jdk、 idea

前言 1.1 软件开发之 Java 开发 Java现在已经占有主流市场 企业级应用领域&#xff08;JavaEE 后台&#xff09;&#xff1a;用来开发企业级的应用程序&#xff0c;大型网站如淘宝、京 东、12306&#xff0c;以及各大物流、银行、金融、社交、医疗、交通、各种 OA 系统等都…

Centos7下root安装Elasticsearchhe和IK分词器

安装Elasticsearchhe和IK分词器 1. 安装前准备 安装Elasticsearch之前&#xff0c;需要安装Java8或Java8以上的Java环境&#xff0c;linux安装jdk百度一下。 2. 下载Elasticsearchhe 创建安装目录 mkdir -p /usr/local/elasticsearch如果主机联网,可以选择在线下载&#…

Matlab可调用MODTRAN5封装器之Mod5

目录 Mod5介绍安装Mod5Mod5文件位置注意事项 运行Mod5创建实例设置MODTRAN参数运行MODTRAN结果绘制示例图 Mod5介绍 MODTRAN 是一个计算地球大气中电磁辐射传输的软件代码。MODTRAN是通过使用具有严格格式的输入文本文件来控制的。这个文件被称为“tape5”&#xff0c;扩展名为…

华硕ROG幻14 2023原装Windows11系统工厂模式带ASUS RECOVERY功能恢复

第一步&#xff1a;下载原装系统文件&#xff08;工厂包&#xff09; 第二步&#xff1a;华硕天选冰刃魔霸枪神灵耀等 需要自备16g空u盘安装 第三步&#xff1a;创建u盘分区&#xff0c;第一个分区格式为FAT32(存放TLK引导文件)&#xff0c;第二个分区大小为NTFS&#xff08…

利用Jetpack Compose进行导航(Navigation)

引言 Jetpack Compose是一个现代化的&#xff0c;声明式的UI工具包&#xff0c;它让我们可以更快、更简便地构建Android的界面。今天&#xff0c;我们要讨论如何使用Jetpack Compose和它的导航库&#xff08;Navigation Compose&#xff09;来进行应用导航。 初步了解Navigati…

单片机学习 15-ds1302时钟实验

DS1302 时钟实验 ​ 在前面章节&#xff0c;我们介绍了如何使用单片机 IO 口模拟 IIC 总线、单总线时序。这一章我们来学习 DS1302 时钟芯片&#xff0c;该芯片是 3 线 SPI 接口&#xff0c;所以需要使用 51单片机的 3 个 IO 口模拟 SPI 时序与 DS1302 时钟芯片通信&#xff0…

maven打包本地jar到项目中

在maven项目中&#xff0c;我们的项目依赖一般取自local的repository或者远程的repository&#xff0c;比如下面这个配置&#xff1a; maven <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> &l…

蓝桥杯专题-试题版-【矩阵乘法】【连号区间数】【闰年判断】【时间转换】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

爱普生L3515打印不出东西,打印后机器工作进纸后出来空白纸张

环境&#xff1a; 爱普生L3515彩色喷墨打印机 问题描述&#xff1a; 爱普生L3515突然打印不出东西&#xff0c;打印后机器工作进纸&#xff0c;出来空白纸张 解决方案&#xff1a; 1.检查是否没有墨水了&#xff0c;开始以为没了&#xff0c;加了满了 2.测试打印机还是打不…

【AUTOSAR】BMS开发实际项目讲解(十五)----电池管理系统架构与系统组件定义

系统架构 /System Architecture 系统结构框图 / System Structure Diagram 系统安全架构图 系统组件定义 / System Components Definition 系统组件定义表 组件需求定义/system components requirement definition系统组件需求定义表 ID 名称 ASIL 描述 SPFM LFM PMHF …

将英文版的Visual Studio 2019 切换为简体中文显示

一、需求说明 在使用Visual Studio 2019集成IDE环境下进行开发工作时;需要将IDE的环境修改为中文环境进行开发工作,中文界面对于不太熟悉Visual Studio 2019 环境的人来说是十分友好的。 二、需求分析 目前安装的Visual Studio 2019集成IDE环境是全英文的界面,需要切换为简…

hash冲突是什么?

哈希&#xff08;散列&#xff09;原理及使用 哈希&#xff08;散列&#xff09;原理及避免哈希冲突 哈希&#xff08;散列&#xff09;原理及使用哈希冲突常见哈希函数解决哈希冲突方案实现一个开散列哈希表 当我们在一堆数据中查找一个元素时&#xff0c;使用普通方法得到的时…

ChatGPT: 交互式AI助手为互联网用户带来全新体验

目录 概述&#xff1a; 优势&#xff1a; 挑战&#xff1a; 未来发展方向&#xff1a; 概述&#xff1a; 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;正以惊人的速度改变着我们的生活方式和体验方式。AI 的应用范围越来越广泛&#xff0c;从语音助手到…

Linux 内存详解,即top、free、vmstat、meminfo、Buffer和Cache的介绍

Linux 内存详解&#xff0c;即top、free、vmstat、meminfo、Buffer和Cache的介绍_用作内核缓存的内存量_zzhongcy的博客-CSDN博客 1、top linux下的任务管理器 top命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况&#xff0c;类似于Win…

C#项目练习系列--1.倒计时器

C#项目练习系列--1.倒计时器 实操感想代码 实操 总体实现功能&#xff1a;选定计时时间—点击开始计时—进度条和剩余时间显示—提示时间到。 软件版本&#xff1a;VS2019 1.新建工程 选择c#&#xff0c;windows窗体应用&#xff0c;.NET Framework版本选择4或4以下时最后…

SpringBoot+WebSocket+Session共享

前言 WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端 一、为什么需要WebSocket HTTP 是基于请求响应式的&#xff0c;即通信只能由客户端发起&#xff0c;服务端做出响应&#xff0c;无状态&…

Spring Boot 中的 PropertySource 是什么,原理,如何使用

Spring Boot 中的 PropertySource 是什么&#xff0c;原理&#xff0c;如何使用 介绍 在 Spring Boot 中&#xff0c;PropertySource 是一个非常重要的概念。它允许您在应用程序中定义属性&#xff0c;并将这些属性注入到 Spring 环境中。在本文中&#xff0c;我们将介绍 Spr…