写点什么

JavaScript 即将加入私有字段和私有方法

  • 2019-10-15
  • 本文字数:899 字

    阅读完需:约 3 分钟

JavaScript即将加入私有字段和私有方法

尽管 JavaScript 在 2015 年就有了类,但仍然没有私有字段和私有方法。由于TC39委员会内部存在分歧,这些功能在最初版本中被取消。有三个规范草案打算在不久的将来将这些功能引入到 JavaScript 类中。


一旦这些规范被正式接受,就可以使用“#”符号来定义私有字段和私有方法。之所以决定使用‘#’符号而不是传统的下划线“_”,是为了避免对现有库造成太大影响,现在的库已经使用下划线来标记私有字段。


尽管现有的库使用下划线将字段或方法标记为私有,但开发人员仍然可以访问它们。将这些变量变成真正的私有可能会破坏很多现有的应用程序,从而降低新规范的采用速度。


React 中的一些东西可以用来说明这个问题。React 是一个流行的 JavaScript 框架,它不得不使用一些直白的变量名来阻止开发人员使用它们(尽管这些变量名被标记为私有),比如“_SECRET_DOM_DO_NOT_USE_ORYOU_WILL_BE_FIRED”。


TC39 的每个提案分别与类私有字段和私有方法的某个方面有关。不过将它们作为一个整体提案应该是没问题的,因为它们很可能同时被添加到 JavaScript 中。提案内容如下:

类字段声明

目前在 JavaScript 中还不能直接定义类字段,开发人员是在构造函数中定义这些字段的。


class Counter {   constructor() {     this.xValue = 0;   } }
复制代码


该提案增加了直接在类中定义公共和私有字段的能力。


class Counter {   xValue = 0;  #yValue = 0;  constructor() { }}
复制代码

类的私有方法和 GETTER/SETTER 方法

该提案与私有方法的添加和私有 getter/setter 的使用有关。


class Counter {   get #x() { return #xValue; }   set #x(value) { }
#clicked() { } }
复制代码

类的静态特性

该提案定义了私有和公共静态字段/方法的使用方式。


class CustomDate {   static public() = {}   static #private() = {} }
复制代码


需要注意的是,过度使用私有字段和私有方法可能会对代码库造成不利影响。私有方法不能使用单元测试进行测试,并且通常带有单一职责原则固有的问题。


私有字段和私有方法还没有正式被 JavaScript 接受,但开发人员已经可以在 Babel 中使用它们了。TypeScript 的实现版本目前正在开发当中,未来会发布。


原文链接


Coming Next, JavaScript Private Class Fields & Methods


2019-10-15 16:202684
用户头像

发布了 731 篇内容, 共 483.3 次阅读, 收获喜欢 2008 次。

关注

评论 2 条评论

发布
用户头像
很奇怪。。。typescript 一开始就有private,public 还有protected 字段。不管如何定义,编译到的es5的版本的js,都可以参与单元测试的吧。
2019-10-16 20:10
回复
typescript只是在自己的环境下,自己特色的东西才有对应的限制,如果编译成标准js后一样要符合js的标准,所有ts的特性就是失效的,并不冲突呀
2019-11-11 15:02
回复
没有更多了
发现更多内容

Java中的泛型详解

共饮一杯无

Java 泛型 11月月更

Java中的Iterator迭代器详解

共饮一杯无

Java 迭代器 11月月更

CTO:我叫你画个技术图给我看看,咋就这么费劲呢?

程序员小毕

程序员 程序人生 CTO 画图软件 架构图

Baklib|搭建帮助中心,推动SaaS企业发展

Baklib

SaaS 帮助中心

链上互助公排代币模式dapp系统开发合约定制

开发微hkkf5566

极客时间运维进阶训练营第一周作业

LiaoWD

dokcer

React源码分析8-状态更新的优先级机制

goClient1992

React

JavaScript事件捕获和事件冒泡

格斗家不爱在外太空沉思

JavaScript 前端 11月月更

Oracle 开发规范(二)

默默的成长

oracle 前端 11月月更

京东云开发者|代码评审的价值和规范

京东科技开发者

单元测试 代码设计 代码评审 `后端

从React源码分析看useEffect

goClient1992

React

vue面试经常会问的那些题

bb_xiaxia1998

Vue

聊聊FinOps

Jianmu

低码平台标准列表页落地实践,同事直呼好活

Java全栈架构师

Java 程序员 程序人生 低代码开发 低代码平台

React源码分析8-状态更新的优先级机制

goClient1992

React

Oracle 表空间创建标准(一)

默默的成长

oracle 前端 11月月更

极客时间运维进阶训练营第二周作业

LiaoWD

Harbor docker build Containerd

Centos7下Docker的安装

我是一个茶壶

容器 ,docker 11月月更

澜舟科技AIGC再进一步,推出澜舟论文助写 LPA,用 AI 帮助写好英文论文

澜舟孟子开源社区

人工智能 nlp 文本生成

线上 hive on spark 作业执行超时问题排查案例分享

明哥的IT随笔

hadoop spark hive

Baklib|如何才能做好企业内部知识管理?

Baklib

知识管理

AJAX的作用和使用

格斗家不爱在外太空沉思

JavaScript ajax 11月月更

Echarts柱状图表的使用

格斗家不爱在外太空沉思

vue.js eCharts 11月月更

假如问:你是怎样优化Vue项目的,该怎么回答

bb_xiaxia1998

Vue

【电商实战00】用敏捷开发的思想,带你快速上手实战项目

王中阳Go

golang 高效工作 学习方法 11月月更 电商实战

京东云开发者|mysql基于binlake同步ES积压解决方案

京东科技开发者

MySQL ES 数据同步 MySQL 数据库

Java中的递归详解

共饮一杯无

Java 递归 11月月更

鸿蒙开发实例 | 分布式涂鸦

TiAmo

华为 鸿蒙 云开发 11月月更

MASA MAUI Plugin (五)Android 指纹识别

MASA技术团队

blazor MASA MAUI Xamarin MASA Blazor

一个合格的vue工程师必会的20道面试题

bb_xiaxia1998

Vue

AI技术在基于风险测试模式转型中的应用

百度Geek说

人工智能 AI技术 企业号十月 PK 榜 智能测试

JavaScript即将加入私有字段和私有方法_编程语言_Guy Nesher_InfoQ精选文章