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界以一种不成文的规定,在变量前加上下划线" _
"前缀,约定这是一个私有属性;但实际上,它仍然是一个穿上皇帝新衣般的公共属性。
2. 闭包
在 constructor
作用域内定义局部变量,内部载通过闭包的方式对外暴露该变量。
这种方式,虽然实现了私有属性外部不可访问,但在类内部,该属性同样没法在不同的方法内共享,仍然不是严格意义上的“私有属性”。
3. Symbols & Getters
利用 Symbol
变量可以作为对象 key
的特点,我们可以模拟实现更真实的私有属性。
可是,也不是毫无破绽:
借助getOwnPropertySymbols
方法可以取出对象的
Symbol
键值。
4. WeakMap & Getters
WeakMap
的实现与 Symbol
如出一辙。
巨人的肩膀
以上,是目前阶段JS实现属性私有比较可行的方案,可能实际中很少应用,但如果你在面试中遇到这个问题,或许这些方案可以参考下。
然后,所有这些方案里面,建议选 TypeScript
的 private
。
最后,关于JS中实现私有属性,欢迎读者们评论交流你的看法~
参照:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 私有属性的实现
- 协议中的私有属性
- JavaScript 新语法详解:Class 的私有属性与私有方法
- 外部调用类的私有属性
- [译] ECMAScript 类 —— 定义私有属性
- JavaScript Class(类) 中的 Private(私有) 和 Public(公有) 属性
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
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》 这本书的介绍吧!