首页 > 其他分享 >ES6中定义私有属性详解

ES6中定义私有属性详解

时间:2024-12-31 22:58:51浏览次数:8  
标签:ES6 obj 私有 privateProperty WeakMap value 详解 属性

在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及以后版本的环境中。

标签:ES6,obj,私有,privateProperty,WeakMap,value,详解,属性
From: https://blog.csdn.net/cuijiying/article/details/144851255

相关文章

  • Rust f64详解
    一、Rust中的f64类型与IEEE754双精度浮点数Rust中的f64类型是一个双精度浮点数类型,它严格遵循IEEE754双精度标准。这意味着f64类型在Rust中的存储和表示方式与IEEE754双精度浮点数完全一致。二、存储格式f64类型由64位二进制数表示,分为以下三部分:1.符号位(1位):位置:第......
  • 促销系统:促销业务详解
    大家好,我是汤师爷~促销活动的核心价值在于利用价格优势吸引贪便宜的消费者。许多用户会积极寻找各类优惠,看到红包或折扣时容易产生购买冲动。对商家而言,促销是快速清理库存的有效工具。特别是对于季节性商品或临期产品,促销能加快出货速度。同时,促销也能提升销售额,当顾客对商品感......
  • Type c系列接口驱动电路·Type c系列接口驱动电路详解内置供电驱动电路使用USB2.0驱动
    目录Typec常见封装Typec不同系列Typec驱动电路Typec数据手册                                 编写不易,仅供学习,请勿搬运,感谢理解常见元器件驱动电路文章专栏连接LM7805系列降压芯片驱动电路·降压芯片驱动电路详解-CSDN博客ME......
  • 详解Redis的List类型及相关命令
    目录LPUSHLPUSHXRPUSHRPUSHXLRANGELPOPRPOPLINDEXLINSERTLLEN阻塞版本命令BLPOPBRPOP内部编码应用场景Redis中的List类型,是保证元素有序的,支持队列从两端进行插入删除和获取,并且元素时刻重复的。LPUSH将⼀个或者多个元素从左侧放⼊(头插)到list中。......
  • 【prometheus】【Node_export】【原理介绍】【源码阅读】node_export的newHandler函数
    这两个函数是Go语言node_exporter的核心部分,主要与Prometheus指标的收集、注册、处理以及HTTP处理器的创建相关。我们将逐步解析每个函数的逻辑。目录1.newHandler函数解析:2.innerHandler函数解析:总结:1.newHandler函数funcnewHandler(includeExpor......
  • Java Map 集合详解:基础用法、常见实现类与高频面试题解析
    在Java集合框架中,Map是用于存储键值对(Key-Value)的重要接口,广泛应用于开发中的各种场景。本文将详细讲解Map的基础概念、常见实现类及其特性,并结合代码示例和高频面试问题,帮助你深入理解Map的用法。......
  • 浅谈大模型私有化+精调:面向垂直行业与特定场景之需
    今天探讨大模型的私有化和精调,以便让预训练的通用模型更好地适应特定的任务或行业需求。当然,从产品经理的视角出发,我们不会非常深入(鄙人能力也有限),而是建立相关的基本认知。个人观点仅供参考,欢迎评论区补充、斧正~预警:全文约1万字,且比较偏技术&理论。如果你只是想了解下......
  • Java List 集合详解:基础用法、常见实现类与高频面试题解析
    正文在Java集合框架中,List是一个非常重要的接口,广泛用于存储有序的元素集合。本文将带你深入了解List接口的基本用法、常见实现类及其扩展,同时通过实际代码示例帮助你快速掌握这些知识。......
  • 【人工智能机器学习基础篇】——深入详解深度学习之神经网络基础:理解前馈神经网络与反
    深入详解深度学习之神经网络基础:理解前馈神经网络与反向传播算法        深度学习作为人工智能(AI)的核心技术,已经在语音识别、图像处理、自然语言处理等诸多领域取得了显著的成果。而在深度学习的众多模型中,**前馈神经网络(FeedforwardNeuralNetworks,FNN)与反向传播......
  • 【分布式数据库与数据存储方案】详解
    分布式数据库与数据存储方案一、分布式数据库概述(一)概念分布式数据库是一种将数据分散存储在多个物理节点上的数据库系统,这些节点通过网络进行连接和通信,对外呈现出一个统一的逻辑数据库,用户或应用程序可以像操作传统的单一数据库一样与之交互,但其内部通过一系列复杂的......