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 相关文章推荐
Javascript实现仿WebQQ界面的“浮云”兼容 IE7以上版本及FF
Apr 27 Javascript
JQuery+DIV自定义滚动条样式的具体实现
Jun 25 Javascript
判断文件是否正在被使用的JS代码
Dec 21 Javascript
JS的参数传递示例介绍
Feb 08 Javascript
jQuery $命名冲突解决方案汇总
Nov 13 Javascript
javascript关于继承的用法汇总
Dec 20 Javascript
使用Angular.js开发的注意事项
Oct 19 Javascript
vue渲染时闪烁{{}}的问题及解决方法
Mar 28 Javascript
详解ES6 Promise对象then方法链式调用
Oct 20 Javascript
JS函数进阶之继承用法实例分析
Jan 15 Javascript
微信小程序之滑动页面隐藏和显示组件功能的实现代码
Jun 19 Javascript
ant-design-vue 时间选择器赋值默认时间的操作
Oct 27 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 和 HTML
2006/10/09 PHP
我的论坛源代码(七)
2006/10/09 PHP
PHP新手上路(十)
2006/10/09 PHP
PHP 文件编程综合案例-文件上传的实现
2013/07/03 PHP
PHP5.3连接Oracle客户端及PDO_OCI模块的安装方法
2016/05/13 PHP
php ZipArchive实现多文件打包下载实例
2019/10/31 PHP
jquery 的 $("#id").html() 无内容的解决方法
2010/06/07 Javascript
Extjs中常用表单介绍与应用
2010/06/07 Javascript
jquery.cvtooltip.js 基于jquery的气泡提示插件
2010/11/19 Javascript
javascript动画浅析
2012/08/30 Javascript
js中string转int把String类型转化成int类型
2014/08/13 Javascript
node.js中的fs.open方法使用说明
2014/12/17 Javascript
浅谈JavaScript Array对象
2014/12/29 Javascript
jQuery判断一个元素是否可见的方法
2015/06/05 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
2017/09/04 Javascript
a标签调用js的方法总结
2019/09/05 Javascript
javascript数组元素删除方法delete和splice解析
2019/12/09 Javascript
js实现登录时记住密码的方法分析
2020/04/05 Javascript
JS实现多选框的操作
2020/06/24 Javascript
js实现简易拖拽的示例
2020/10/26 Javascript
Python 匹配任意字符(包括换行符)的正则表达式写法
2009/10/29 Python
python安装mysql-python简明笔记(ubuntu环境)
2016/06/25 Python
python获取代理IP的实例分享
2018/05/07 Python
django ajax json的实例代码
2018/05/29 Python
Python 使用元类type创建类对象常见应用详解
2019/10/17 Python
Python 实现自动导入缺失的库
2019/10/29 Python
python 使用建议与技巧分享(四)
2020/08/18 Python
巴西最大的在线约会网站:ParPerfeito
2018/07/11 全球购物
JD Sports比利时官网:英国领先的运动鞋和运动服饰零售商
2018/10/10 全球购物
欧克利英国官网:Oakley英国
2019/08/24 全球购物
表彰先进集体通报
2014/01/12 职场文书
小学运动会广播稿200字(十二篇)
2014/01/14 职场文书
施工安全汇报材料
2014/08/17 职场文书
党的群众路线教育实践活动个人对照检查材料(公安)
2014/11/05 职场文书
感恩教师节主题班会
2015/08/12 职场文书
教你使用Pandas直接核算Excel中快递费用
2021/05/12 Python