ES6 Class中实现私有属性的一些方法总结


Posted in Javascript onJuly 08, 2019

私有属性

私有属性是面向对象编程(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实现属性私有比较可行的方案,可能实际中很少应用,但如果你在面试中遇到这个问题,或许这些方案可以参考下。

然后,所有这些方案里面,建议选TypeScript的private。

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

参照:

ECMAScript Classes - Keeping Things Private

原文:Github

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jquery.ui.progressbar 中文文档
Nov 26 Javascript
jquery $.fn $.fx是什么意思有什么用
Nov 04 Javascript
JS动态修改表格cellPadding和cellSpacing的方法
Mar 31 Javascript
jQuery实现带动画效果的多级下拉菜单代码
Sep 08 Javascript
jQuery CSS3自定义美化Checkbox实现代码
May 12 Javascript
js仿新浪微博消息发布功能
Feb 17 Javascript
socket.io学习教程之基础介绍(一)
Apr 29 Javascript
vue.js中v-on:textInput无法执行事件问题的解决过程
Jul 12 Javascript
详解node+express+ejs+bootstrap构建项目
Sep 27 Javascript
浅谈Angular HttpClient简单入门
May 04 Javascript
史上最为详细的javascript继承(推荐)
May 18 Javascript
在antd Form表单中select设置初始值操作
Nov 02 Javascript
ElementUI Tag组件实现多标签生成的方法示例
Jul 08 #Javascript
利用不到200行代码写一款属于你自己的js类库
Jul 08 #Javascript
Vue中util的工具函数实例详解
Jul 08 #Javascript
详解基于 Node.js 的轻量级云函数功能实现
Jul 08 #Javascript
使用 node.js 模仿 Apache 小部分功能
Jul 07 #Javascript
echarts统计x轴区间的数值实例代码详解
Jul 07 #Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
Jul 07 #Javascript
You might like
纯php打造的tab选项卡效果代码(不用js)
2010/12/29 PHP
php中让人头疼的浮点数运算分析
2016/10/10 PHP
php PDO判断连接是否可用的实现方法
2017/04/03 PHP
PHP设计模式之外观模式(Facade)入门与应用详解
2019/12/13 PHP
基于php解决json_encode中文UNICODE转码问题
2020/11/10 PHP
List the Codec Files on a Computer
2007/06/11 Javascript
javascript动态改变img的src属性图片不显示的解决方法
2010/10/20 Javascript
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
2014/04/29 Javascript
jquery实现定时自动轮播特效
2015/12/10 Javascript
jQuery的选择器中的通配符[id^='code']或[name^='code']及jquery选择器总结
2015/12/24 Javascript
详解JavaScript中的构造器Constructor模式
2016/01/14 Javascript
简单解析JavaScript中的__proto__属性
2016/05/10 Javascript
微信小程序 网络请求(GET请求)详解
2016/11/16 Javascript
微信小程序 css使用技巧总结
2017/01/09 Javascript
AngulerJS学习之按需动态加载文件
2017/02/13 Javascript
jquery操作select取值赋值与设置选中实例
2017/02/28 Javascript
jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法
2017/03/03 Javascript
使用node.js对音视频文件加密的实例代码
2017/08/30 Javascript
ionic3实战教程之随机布局瀑布流的实现方法
2017/12/28 Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
2018/08/06 Javascript
解决JavaScript中0.1+0.2不等于0.3问题
2018/10/23 Javascript
python检测lvs real server状态
2014/01/22 Python
Python跳出循环语句continue与break的区别
2014/08/25 Python
Python for循环搭配else常见问题解决
2020/02/11 Python
举例详解CSS3中的Transition
2015/07/15 HTML / CSS
HTML5实现锚点时请使用id取代name
2013/09/06 HTML / CSS
Skechers越南官方网站:来自美国的运动休闲品牌
2021/02/22 全球购物
机电一体化大学生求职信
2013/11/08 职场文书
酒店节能减排方案
2014/05/26 职场文书
党性锻炼的心得体会
2014/09/03 职场文书
房产协议书范本2014
2014/09/30 职场文书
2014年人事科工作总结
2014/11/19 职场文书
2015年教师节活动总结
2015/03/20 职场文书
绿里奇迹观后感
2015/06/15 职场文书
药品销售员2015年终工作总结
2015/10/22 职场文书
Oracle使用别名的好处
2022/04/19 Oracle