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

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

内容简介:私有属性是面向对象编程(时间回到四年前,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中实现私有属性,欢迎读者们评论交流你的看法~

参照:


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

查看所有标签

猜你喜欢:

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

Beautiful Code

Beautiful Code

Greg Wilson、Andy Oram / O'Reilly Media / 2007-7-6 / GBP 35.99

In this unique work, leading computer scientists discuss how they found unusual, carefully designed solutions to difficult problems. This book lets the reader look over the shoulder of major coding an......一起来看看 《Beautiful Code》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

SHA 加密
SHA 加密

SHA 加密工具