ES6 Class中实现私有属性的几种方法

栏目: JavaScript · 发布时间: 4年前

内容简介:私有属性是面向对象编程(时间回到四年前,2015年6月,ES6发布成为标准,为了纪念这个历史性时刻,这个标准又被称为上面私有属性的声明,需要先经过Babel等编译器编译后才能正常使用。

私有属性是面向对象编程( OOP )中非常常见的一个特性,一般满足以下的特点:

class

备胎Class

时间回到四年前,2015年6月,ES6发布成为标准,为了纪念这个历史性时刻,这个标准又被称为 ES2015 ,至此, JavaScript 中的 class 从备胎中转正。在这之前, class 一直作为JS的关键字,雪藏不见天日。 class 被认为是JS的一种语法糖,它为 JavaScript 带来了用面向对象的思想描述一个实体的能力。但似乎还远远不够, class 的能力远没满足JS开发者们的期待。于是,TC39的大佬们也努力地去做到更好,并推出了一项新的提案:

class Foo {
  #a;  // 私有属性
  constructor(a, b) {
    this.#a = a;
    this.b = b
  }
}
复制代码

上面私有属性的声明,需要先经过Babel等编译器编译后才能正常使用。

提案已经到Stage 3了,未来可期!

可是,一众JSer们已经等不及了......

JSer的挣扎

通过对数据的一定封装,JS开发者们走上了曲线实现“私有属性”之路。

1. 约定俗成

JS界以一种不成文的规定,在变量前加上下划线" _ "前缀,约定这是一个私有属性;但实际上,它仍然是一个穿上皇帝新衣般的公共属性。

ES6 Class中实现私有属性的几种方法

2. 闭包

constructor 作用域内定义局部变量,内部载通过闭包的方式对外暴露该变量。

ES6 Class中实现私有属性的几种方法

这种方式,虽然实现了私有属性外部不可访问,但在类内部,该属性同样没法在不同的方法内共享,仍然不是严格意义上的“私有属性”。

3. Symbols & Getters

利用 Symbol 变量可以作为对象 key 的特点,我们可以模拟实现更真实的私有属性。

ES6 Class中实现私有属性的几种方法

可是,也不是毫无破绽:

ES6 Class中实现私有属性的几种方法
借助 getOwnPropertySymbols 方法可以取出对象的 Symbol

键值。

4. WeakMap & Getters

WeakMap 的实现与 Symbol 如出一辙。

ES6 Class中实现私有属性的几种方法

巨人的肩膀

以上,是目前阶段JS实现属性私有比较可行的方案,可能实际中很少应用,但如果你在面试中遇到这个问题,或许这些方案可以参考下。

然后,所有这些方案里面,建议选 TypeScriptprivate

最后,关于JS中实现私有属性,欢迎读者们评论交流你的看法~

参照:


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序员修炼之道

程序员修炼之道

Andrew Hunt、David Thomas / 马维达 / 电子工业出版社 / 2011-1 / 55.00元

《程序员修炼之道:从小工到专家》内容简介:《程序员修炼之道》由一系列独立的部分组成,涵盖的主题从个人责任、职业发展,知道用于使代码保持灵活、并且易于改编和复用的各种架构技术,利用许多富有娱乐性的奇闻轶事、有思想性的例子及有趣的类比,全面阐释了软件开发的许多不同方面的最佳实践和重大陷阱。无论你是初学者,是有经验的程序员,还是软件项目经理,《程序员修炼之道:从小工到专家》都适合你阅读。一起来看看 《程序员修炼之道》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具