前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ES6私有变量与babel的爱情碰撞

ES6私有变量与babel的爱情碰撞

作者头像
用户2845596
发布于 2021-01-21 07:12:57
发布于 2021-01-21 07:12:57
91400
代码可运行
举报
文章被收录于专栏:劝学劝学
运行总次数:0
代码可运行

私有变量

JS原生不支持私有变量,这让前端开发很头痛,如何实现私有变量对于程序的健壮十分重要。下面就讲下私有变量的几种实现,以及对应的babel插件。

主要是讲ES6相关的SymbolWeakMap,当然闭包也是可以实现的,本篇主要讲es6的。

Symbol
原生实现
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let _method = Symbol('_method');
class Foo {
  constructor() {
    this[_method]();
  }
 
  [_method]() {
    // ...
  }
}
复制代码
babel插件实现

babel-plugin-private-underscores

插件自动处理下划线开头的属性与方法,换成Symbol类型的变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Foo {
  constructor() {
    this._method();
  }
 
  _method() {
    // ...
  }
}
复制代码
WeakMap
原生实现
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const _private = new WeakMap();

class Foo {
  constructor() {
    _private.set(this, 'foo');
  }
  getPrivate() {
  	return _private.get(this);
  }
}

let foo = new Foo();

console.log(foo.getPrivate());  // private
复制代码
babel官方插件实现

我们使用babel官方的插件@babel/plugin-proposal-private-methods, 链接

babel官方插件是JS新的私有属性/方法的提案,在私有属性、方法前面加上#来标识。下面是对应的写法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Foo {
  constructor() {
    this.publicField = this.#privateMethod();
  }

  #privateMethod() {
    return 42;
  }
}
babel-plugin-transform-private-properties

babel-plugin-transform-private-properties插件的写法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Private_Property_Class_With_WeakMap {
    @Private
    p = 'foo'
    
    getP() {
        return this.p
    }
    
    @Private
    private_func () {
        console.log('this\'s a private function')
    }

} 

let ppw = new Private_Property_Class_With_WeakMap()

console.log(ppw.getP()) // => foo
console.log(ppw.p)    // => undefined
ppw.private_func()  // Error: ppw.private_func is not a function
复制代码

babel产物可见babel try it out,需要自己手动加下plugin babel-plugin-transform-private-properties,在右下角Plugins处添加即可

Final

最后对比下SymbolWeakMap的使用,其实两者都实现了私有,并不想_只是一个标记而已(感觉就像babel里的设置为trueloose选项一样)。 对比二者的兼容性,感觉也没多大的区别,对IE有兼容性的就打消使用的想法了。 在nodejs上使用倒还是可以的。

Symbol的浏览器兼容性,来源来自mdn

IE

Chrome

Edge

Safari

Android Webview

ios Safari

nodejs

11+

38+

12+

9+

38+

9+

0.12+

WeakMap的浏览器兼容性,来源来自mdn

IE

Chrome

Edge

Safari

Android Webview

ios Safari

nodejs

11+

36+

12+

8+

37+

8+

0.12+

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ES6前端技术课
3.ES6是目前前端公司比较流行的开发技术,比如说微信开发、支付宝小程序、前端页面等等
张哥编程
2024/12/13
990
深入了解Babel
Babel 是一个用于 JavaScript 的通用多用途编译器,使用 Babel 可以使用(或创建)下一代 的JavaScript,以及下一代 JavaScript 工具。 作为一门语言,JavaScript 不断发展,带来了很多新的规范和建议,使用 Babel 可以让你在这些新的规范和建议全面普及之前就提前使用它们。 Babel 通过将最新标准的 JavaScript 代码编译为已经在目前可以工作的代码来实现上一段提到的内容。这个过程被称为 “源代码到源代码” 的编译,这也被成为 “转换”。
前端逗逗飞
2021/04/30
6790
3-11-12 使用 babel 处理 es6 语法
关于 es6 的内容想必大家都已不再陌生,因为 es10 都已经出来了,只要不是太老的浏览器版本基本都支持 es6 的大多数特性了。可以看这里:http://kangax.github.io/compat-table/es6/ 当然,要保证 es6 或者 es7 的语法进行源码编写后完全可用,我们可以用 babel 将其转成 es5。Babel 是一个工具链,主要用于将 ECMAScript 2015+ 版本的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中。 关于 babel 的使用方法和原理都可以单列一个系列了,在此我们只讲述 babel 如何结合 webpack 使用。
love丁酥酥
2020/02/19
6720
ES6 系列之私有变量的实现
在阅读 《ECMAScript 6 入门》的时候,零散的看到有私有变量的实现,所以在此总结一篇。
腾讯NEXT学位
2019/08/05
5940
babel的常用插件
1.@babel/plugin-proposal-class-properties
挥刀北上
2021/03/03
1.2K0
babel的常用插件
ES6 完全使用手册
在我们开发的时候,可能认为应该默认使用 let 而不是 var,这种情况下,对于需要写保护的变量要使用 const。
夜尽天明
2019/07/17
1.5K0
前端工程师需要了解的 Babel 知识
在前端圈子里,对于 Babel,大家肯定都比较熟悉了。如果哪天少了它,对于前端工程师来说肯定是个噩梦。Babel 的工作原理是怎样的可能了解的人就不太多了。
桃翁
2019/09/24
4590
前端工程师需要了解的 Babel 知识
es6你用过哪些惊艳的写法
这是一个百分百有用,是一个闭着眼睛都会的用法,不过我们注意const/let是es6引入的一个块级作用域的关键字,在{}中定义变量{}外部不能访问,并且不存在变量的提升, let与const定义的变量,不能重复定义,用const申明的变量不能重新赋值。
Maic
2022/07/28
4760
es6你用过哪些惊艳的写法
Babel下的ES6兼容性与规范
IMWeb前端团队
2017/12/28
2.1K0
搞懂babel7常用的配置和优化,这篇就够了!
网上关于babel7的文章很多,但是大多都没有实践,很多讲的模棱两可。 本文将手把手的带你看各种配置下的输入输出转换,彻底让你了解babel7到底该怎么去配置和优化。
ssh_晨曦时梦见兮
2020/04/10
2.9K0
私有属性的 6 种实现方式,你用过几种?
class 是创建对象的模版,由一系列属性和方法构成,用于表示对同一概念的数据和操作。
神说要有光zxg
2022/04/12
9010
私有属性的 6 种实现方式,你用过几种?
Babel 入门指南
Babel 入门指南 ​⚠️ 注意: Babel 可以与很多构建工具(如 Browserify、Grunt、Gulp 等)进行集成。由于本教程选择 Webpack ,所以只讲解与 Webpack
静默虚空
2018/01/05
1.6K0
搞懂babel7常用的配置和优化,这篇就够了!
网上关于babel7的文章很多,但是大多都没有实践,很多讲的模棱两可。 本文将手把手的带你看各种配置下的输入输出转换,彻底让你了解babel7到底该怎么去配置和优化。
ssh_晨曦时梦见兮
2024/01/27
3250
babel实践:真实gulp项目支持ES6转译ES5的跳坑指北
这两天,在对现有项目进行框架优化,由于项目使用gulp+jQuery构建的,不支持ES6规范,不能很好满足越来越复杂的需求场景,尤其是需要多异步任务的情况下,js又要异步又要操作各种DOM状态,状态与状态间也是各种紧耦合,单纯使用es5和jQuery,已经开始影响开发效率了。
前端_AWhile
2019/08/29
2K0
babel实践:真实gulp项目支持ES6转译ES5的跳坑指北
「前端基建」带你在Babel的世界中畅游
Babel在目前前端领域类似一座山一样的存在,任何项目或多或少都有它的身影在浮现。
19组清风
2021/11/15
7400
「前端基建」带你在Babel的世界中畅游
前端工程师的自我修养-关于 Babel 那些事儿
随着 Nodejs 的崛起,编译这个昔日在 Java、C++ 等语言中流行的词,在前端也逐渐火了起来,现在一个前端项目在开发过程中没有编译环节,总感觉这个项目是没有灵魂的。说起前端编译就不得不提前端编译界的扛把子 Babel ,大部分前端攻城狮对 Babel 并不陌生,但是在这个 Ctrl+C 和 Ctrl+V 的年代,大多数人对它也只是知道、了解或者听过,少数可能配置过 Babel,但也仅此而已。作为一个有想法和灵魂的前端攻城狮仅仅知道这些是不够的,你需要对 Babel 有一个系统的了解,今天就来聊聊 Babel 那些事儿。
政采云前端团队
2020/03/10
9310
前端工程师的自我修养-关于 Babel 那些事儿
babel到底将代码转换成什么鸟样?
前言 将babel捧作前端一个划时代的工具一定也不为过,它的出现让许多程序员幸福地用上了es6新语法。但你就这么放心地让babel跑在外网?反正我是不放心,我就曾经过被坑过,于是萌生了研究babel代
李成熙heyli
2018/01/05
2.2K0
babel到底将代码转换成什么鸟样?
最详细、最全面的 Babel 小抄
Babel 是一个工具链,主要用于将采用 ECMAScript 2015+ 语法编写的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中。(我摊牌了,直接从 `Babel` 中文官网[1]复制),我们一般用 Babel 做下面几件事:
码农小余
2022/06/16
8070
最详细、最全面的 Babel 小抄
ES6——类(Class)
ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。 ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。上面的代码用 ES6 的class改写,就是下面这样。
羊羽shine
2019/07/31
1.1K0
通过 20 个棘手的ES6面试问题来提高咱们的 JS 技能
ECMAScript 6(以下简称ES6)是 JS 语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得 JS 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。接下来咱们来看看 20 道棘手的面试题,通过做题,顺带提升一下咱们的 JS 的技能。
前端小智@大迁世界
2019/11/12
8770
相关推荐
ES6前端技术课
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档