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

原文:GitHubjavascript

私有属性

私有属性是面向对象编程(OOP)中很是常见的一个特性,通常知足如下的特色:java

  • 能被class内部的不一样方法访问,但不能在类外部被访问;
  • 子类不能继承父类的私有属性。

备胎Class

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

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

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

提案已经到Stage 3了,将来可期!面试

但是,一众JSer们已经等不及了......编程

JSer的挣扎

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

1. 约定俗成ecmascript

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

2. 闭包this

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

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

3. Symbols & Getters

利用Symbol变量能够做为对象key的特色,咱们能够模拟实现更真实的私有属性。

但是,也不是毫无破绽:
借助 getOwnPropertySymbols方法能够取出对象的 Symbol键值。

4. WeakMap & Getters

WeakMap的实现与Symbol一模一样。

巨人的肩膀

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

而后,全部这些方案里面,建议选TypeScriptprivate

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


参照

相关文章
相关标签/搜索