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

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

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

参照:


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

查看所有标签

猜你喜欢:

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

C++数据结构与算法

C++数据结构与算法

[美]乔兹德克(Adam Drozdek) / 徐丹、吴伟敏 / 清华大学出版社 / 2014-10-1 / 63.00元

本书全面系统地介绍了数据结构,并以C++语言实现相关的算法。书中主要强调了数据结构和算法之间的联系,使用面向对象的方法介绍数据结构,其内容包括算法的复杂度分析、链表、栈、队列、递归、二叉树、图、排序和散列。书中还清晰地阐述了同类教材中较少提到的内存管理、数据压缩和字符串匹配等主题。书中包含大量的示例分析和图形,便于读者进一步理解和巩固所学的知识。一起来看看 《C++数据结构与算法》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换