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中实现私有属性,欢迎读者们评论交流你的看法~

参照:


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

查看所有标签

猜你喜欢:

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

程序员代码面试指南:IT名企算法与数据结构题目最优解

程序员代码面试指南:IT名企算法与数据结构题目最优解

左程云 / 电子工业出版社 / 2015-9 / 79.00元

这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现。针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮助广大程序员的面试准备做到万无一失。“刷”完本书后,你就是“题王”!__eol__本书采用题目+解答的方式组织内容,并把面试题类型相近或者解法相近的题目尽量放在一起,读者在学习本书时很容易看出面试题解法之间的联......一起来看看 《程序员代码面试指南:IT名企算法与数据结构题目最优解》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具