提案已经到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中实现私有属性,欢迎读者们评论交流你的看法~
参照:
ECMAScript Classes - Keeping Things Private
原文:Github
总结