当前位置: 首页 > news >正文

ES6中定义私有属性详解

在ES6中,定义私有属性的方式相对传统的JavaScript有所不同。ES6并没有提供直接的语法来定义私有属性,但可以通过几种方法间接实现私有属性。

1. 使用Symbol来模拟私有属性

Symbol是一种新的数据类型,可以作为对象的键,并且它的值是唯一的,不容易被外部访问或修改。

示例:
const _privateProperty = Symbol('privateProperty');class MyClass {constructor(value) {this[_privateProperty] = value;}get privateProperty() {return this[_privateProperty];}
}const obj = new MyClass(42);
console.log(obj.privateProperty); // 输出 42
console.log(obj._privateProperty);     // 输出 undefined
  • _privateProperty是一个Symbol,它唯一且不会被外部访问(除非通过同样的Symbol引用)。
  • this[_privateProperty]用于存储私有数据。
  • 外部无法直接通过obj._privateProperty访问这个属性,只有通过privatePropertyget方法才能访问。

2. 使用WeakMap来模拟私有属性

WeakMap是一种键值对集合,其中的键必须是对象,而值可以是任何数据类型。WeakMap的键是弱引用,不会阻止垃圾回收机制清理这些键。

示例:
const privateProps = new WeakMap();class MyClass {constructor(value) {privateProps.set(this, { privateProperty: value });}get privateProperty() {return privateProps.get(this).privateProperty;}
}const obj = new MyClass(42);
console.log(obj.privateProperty); // 输出 42
  • privateProps是一个WeakMap,用于存储对象的私有属性。
  • privateProps.set(this, { privateProperty: value })将私有属性与实例关联。
  • privateProps.get(this)通过实例来获取私有属性。

3. 使用ES2022中的类字段语法(#符号)

在ES2022(ES13)中,JavaScript正式引入了类字段语法,通过使用#符号来定义私有属性。这是最直接和现代的方式。

示例:
class MyClass {#privateProperty;constructor(value) {this.#privateProperty = value;}get privateProperty() {return this.#privateProperty;}
}const obj = new MyClass(42);
console.log(obj.privateProperty); // 输出 42
console.log(obj.#privateProperty);     // 会抛出 SyntaxError: Private field '#privateProperty' must be declared in an enclosing class
  • 使用#privateProperty定义私有属性。
  • 外部无法直接访问#privateProperty,如果尝试直接访问会报错。
  • 只有类内部的方法可以访问私有属性。

总结

  • Symbol:可以作为私有属性的键,但需要手动管理和访问,较为灵活。
  • WeakMap:通过WeakMap存储私有数据,提供了更好的封装性,避免了直接暴露属性。
  • #符号(ES2022):最直接且简洁的私有属性实现,官方语法,强制封装。

对于现代的前端开发,推荐使用#符号来定义私有属性,尤其是在ES2022及以后版本的环境中。

http://www.lryc.cn/news/513345.html

相关文章:

  • 工业5G路由器让无人机数据传输 “飞” 起来
  • 面试经典150题——滑动窗口
  • MiFlash 线刷工具下载合集
  • 【MySQL高级】第1-4章
  • 课程设计项目之基于Python实现围棋游戏代码
  • uni-app tab 双击事件监听
  • 如何在Maxscript脚本中检查磁盘可用空间?
  • pytorch梯度上下文管理器介绍
  • Redis Stream:实时数据处理的高效解决方案
  • 使用交换机构建简单局域网
  • 基于MATLAB的冰箱水果保鲜识别系统
  • Flink源码解析之:Flink On Yarn模式任务提交部署过程解析
  • 吊舱激光测距核心技术详解!
  • [ZJCTF 2019]NiZhuanSiWei
  • Kafka配置公网或NLB访问(TCP代理)
  • 大模型推理:vllm多机多卡分布式本地部署
  • clickhouse-backup配置及使用(Linux)
  • 【YashanDB知识库】启动yasom时报错:sqlite connection error
  • JAVA学习笔记_Redis进阶
  • LabVIEW手部运动机能实验系统
  • SpringBoot的注解@SpringBootApplication及自动装配
  • STM32学习之EXTI外部中断(以对外式红外传感器 / 旋转编码器为例)
  • 数字赋能:制造企业如何靠“数字能力”实现可持续“超车”?
  • .NET在中国的就业前景:开源与跨平台带来的新机遇
  • 【基础篇】一、MySQL数据库基础知识
  • 预训练深度双向 Transformers 做语言理解
  • 理解js闭包,原型,原型链
  • linux tar 文件解压压缩
  • 【SQL server】教材数据库(5)
  • Oracle 11G还有新BUG?ORACLE 表空间迷案!