时间:2021-05-28
私有属性
私有属性是面向对象编程(OOP)中非常常见的一个特性,一般满足以下的特点:
备胎Class
时间回到四年前,2015年6月,ES6发布成为标准,为了纪念这个历史性时刻,这个标准又被称为ES2015,至此,JavaScript中的class从备胎中转正。在这之前,class一直作为JS的关键字,雪藏不见天日。
class被认为是JS的一种语法糖,它为JavaScript带来了用面向对象的思想描述一个实体的能力。但似乎还远远不够,class的能力远没满足JS开发者们的期待。于是,TC39的大佬们也努力地去做到更好,并推出了一项新的提案:
上面私有属性的声明,需要先经过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中实现私有属性,欢迎读者们评论交流你的看法~
参照:
ECMAScript Classes - Keeping Things Private
原文:Github
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了es6中class类静态方法,静态属性,实例属性,实例方法。分享给大家供大家参考,具体如下:es6新增了一种定义对象实例的方法,使用class关键
使用ES6语法重构React组件在AirbnbReact/JSXStyleGuide中,推荐使用ES6语法来编写react组件。下面总结一下使用ES6class
本文实例讲述了ES6中Class类的静态方法。分享给大家供大家参考,具体如下:以前看过的es6的东西,又忘了,再总结下:类相当于实例的原型,所有在类中定义的方法
Javascipt语法不支持"类"(class)[es6已经支持],但是有模拟类的方法。今天我主要谈谈Javascipt中模拟“类”的方法及js中继承的总结和回
本节我们来学习ES6中字符串类型的扩展,包括一些字符串对象的新增方法的使用等。字符的Unicode表示法ES6加强了对Unicode的支持,JavaScript