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 学习笔记(六)
Dec 31 Javascript
html的DOM中document对象images集合用法实例
Jan 21 Javascript
jQuery使用drag效果实现自由拖拽div
Jun 11 Javascript
关于在Servelet中如何获取当前时间的操作方法
Jun 28 Javascript
浅谈js数据类型判断与数组判断
Aug 29 Javascript
Vue 中的compile操作方法
Feb 26 Javascript
详解React+Koa实现服务端渲染(SSR)
May 23 Javascript
Angular7.2.7路由使用初体验
Mar 01 Javascript
简单了解Vue + ElementUI后台管理模板
Apr 07 Javascript
JS正则表达式常见函数与用法小结
Apr 13 Javascript
js实现金山打字通小游戏
Jul 24 Javascript
Javascript confirm多种使用方法解析
Sep 25 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
第十三节--对象串行化
2006/11/16 PHP
php中利用str_pad函数生成数字递增形式的产品编号
2013/09/30 PHP
[原创]php集成安装包wampserver修改密码后phpmyadmin无法登陆的解决方法
2016/11/23 PHP
PHP静态成员变量和非静态成员变量详解
2017/02/14 PHP
Yii2.0框架behaviors方法使用实例分析
2019/09/30 PHP
讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
2007/04/12 Javascript
js函数般调用正则
2008/04/08 Javascript
百度 popup.js 完美修正版非常的不错 脚本之家推荐
2009/04/17 Javascript
javascript 动态生成私有变量访问器
2009/12/06 Javascript
JS操作Cookies包括(读取添加与删除)
2012/12/26 Javascript
js Map List 遍历使用示例
2013/07/10 Javascript
JavaScript新窗口与子窗口传值详解
2014/02/11 Javascript
javascript跨域的方法汇总
2015/10/23 Javascript
7个jQuery最佳实践
2016/01/12 Javascript
webpack中引用jquery的简单实现
2016/06/08 Javascript
Vue开发过程中遇到的疑惑知识点总结
2017/01/20 Javascript
babel基本使用详解
2017/02/17 Javascript
细说webpack源码之compile流程-入口函数run
2017/12/26 Javascript
javascript写一个ajax自动拦截并下载数据代码实例
2019/09/07 Javascript
jQuery实现雪花飘落效果
2020/08/02 jQuery
element中table高度自适应的实现
2020/10/21 Javascript
玩转python selenium鼠标键盘操作(ActionChains)
2020/04/12 Python
Python 2与Python 3版本和编码的对比
2017/02/14 Python
Python字符串中添加、插入特定字符的方法
2019/09/10 Python
Django框架序列化与反序列化操作详解
2019/11/01 Python
美国珠宝精品店:Opulent Jewelers
2019/08/20 全球购物
成人毕业生自我鉴定
2013/10/18 职场文书
2014信息技术专业毕业生自我评价
2014/01/17 职场文书
党员活动日总结
2014/05/05 职场文书
导师推荐信范文
2014/05/09 职场文书
县长群众路线对照检查材料思想汇报
2014/10/02 职场文书
公务员考察材料范文
2014/12/23 职场文书
护士节慰问信
2015/02/15 职场文书
遇事可以测出您的见识与格局
2019/09/16 职场文书
python编写函数注意事项总结
2021/03/29 Python
关于python爬虫应用urllib库作用分析
2021/09/04 Python