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

什么是Symbol?

什么是Symbol?


** 例子 1:对象“私有属性”隔离(防止外部乱改)**

场景:我们写一个用户模型类 User,需要标记“是否已登录”这个状态,但不想让外部直接改。

// user.js
const _isLogged = Symbol('isLogged');export class User {constructor(name) {this.name = name;this[_isLogged] = false;}login() {this[_isLogged] = true;}isLogged() {return this[_isLogged];}
}

外部使用:

import { User } from './user.js';const u = new User('Tom');
u.login();console.log(u.isLogged()); // trueconsole.log(Object.keys(u)); // ['name'] 看不到 isLogged 状态
u._isLogged = false; // 无效,外部改不了 Symbol 的那个字段

解释:

_isLogged 是一个 Symbol,别人看不见,也拿不到引用。

这样你就能“保护”这个属性,相当于实现了“私有字段”。


⚙️ 例子 2:防止框架/插件字段冲突(在库开发中常见)

场景:假设你写了一个数据追踪库 tracker.js,要在对象里偷偷存一些标记信息。

但怕用户对象里也有同名字段,比如 id、__meta 等。

// tracker.js
const TRACKER_ID = Symbol('trackerId');export function markTracked(obj) {obj[TRACKER_ID] = Date.now();
}export function isTracked(obj) {return !!obj[TRACKER_ID];
}

外部代码:

import { markTracked, isTracked } from './tracker.js';const user = { id: 1, name: 'Tom' };
markTracked(user);console.log(user); 
// { id: 1, name: 'Tom' }  // 看不出来被标记了console.log(isTracked(user)); // true

意义:

你的库可以安全地在任意对象上打“隐形标记”,

不怕和用户自己的字段重名。


** 例子 3:自定义对象行为(框架内部常用)**

场景:实现一个类,控制它在被转字符串或比较时的表现。

const ID = Symbol('id');class Product {constructor(name, id) {this.name = name;this[ID] = id;}[Symbol.toPrimitive](hint) {if (hint === 'string') return this.name;if (hint === 'number') return this[ID];return this.name;}
}const p = new Product('iPhone', 1001);console.log(`${p}`); // 'iPhone'
console.log(+p);     // 1001

在一些框架中(比如 ORM / 数据模型),会用这种方式:

  • 让对象在日志打印时显示友好的字符串;
  • 但在计算或比较时,自动转成 ID 或主键值。

** Bonus:与** Symbol.for() 结合,用全局共享标识

场景:多个模块都需要共享一个“全局唯一标识”,比如 Redux 中的 action type。

// moduleA.js
export const ACTION_TYPE = Symbol.for('APP_ACTION');// moduleB.js
import { ACTION_TYPE } from './moduleA.js';const action = { type: ACTION_TYPE, payload: 'data' };// 任意地方只要用 Symbol.for('APP_ACTION') 拿到的就是同一个标识
console.log(Symbol.for('APP_ACTION') === ACTION_TYPE); // true

✅ 总结(贴近实战的用途)

用途 实际场景
1️⃣ 隐藏内部属性 模拟私有字段(框架、SDK 中常见)
2️⃣ 防止命名冲突 在第三方库或插件中安全打标
3️⃣ 自定义对象行为 控制 toString()、+、== 的表现
4️⃣ 跨模块唯一标识 用 Symbol.for() 实现全局共享常量

Don’t reinvent the wheel, library code is there to help.

欢迎关注公-众-号【TaonyDaily】、留言、评论,一起学习。

http://www.jsqmd.com/news/10958/

相关文章:

  • 苹果应用上架全流程指南 iOS 应用发布步骤、App Store 审核流程、ipa 文件上传与 uni-app 打包实战经验 - 教程
  • 2025 年门窗厂家推荐排行榜,新标门窗从型材到成品实现全链新标造铝合金门窗 / 系统门窗推荐这十家公司
  • PyCharm 2025.1重磅升级:AI驱动开发+全功能免费核心,Python开发者必看
  • create dir or file in Qpython
  • Oracle案例:SOLARIS RAC平台模拟节点crash后强制删除与增加
  • 学习笔记——计算机程序设计
  • CAD文件处理控件Aspose.CAD教程:在 Python 中将 SVG 转换为 PDF
  • 电子打气泵方案(工作原理和组成以及功能参数)
  • 2025 年电源滤波器源头厂家最新推荐排行榜:精选优质国内品牌,覆盖单相 / 三相 / 直流等多类型产品直流/IEC插座式/定制化电源滤波器厂家推荐
  • (六)重构的艺术:简化困难条件逻辑的秘诀
  • 2025 年压力表厂家最新推荐排行榜重磅发布!聚焦耐腐蚀耐震性能,助力企业精准选优质产品数显/耐高温/数字/抗震/膜盒/隔膜压力表厂家推荐
  • 故障诊断:奇怪的ORA-01000故障处理
  • 2025 年全屋定制厂家最新推荐排行榜:聚焦 ENF 级环保与优质服务力,权威甄选品牌助消费者精准选择
  • 大三上 需求与商业模式创新 作业1的设想:如何评价
  • C/C++逆向分析实战:变量存储与安全防护全攻略
  • 穿透式监管合规:政府投资基金数字化报送实践(璞华公开课第4期活动回顾)
  • 国产项目管理工具Gitee:数字化转型浪潮中的本土化破局者
  • 2025年磁翻板液位计生产商,制造商哪家好?生产厂家推荐这家!
  • IIS8.5 安装证书
  • 2025南通婚纱摄影厂家最新推荐榜:匠心工艺与浪漫美学完美结合
  • 免费音乐软件,哔哔音乐 免费下载及安装!免费音乐播放器
  • 多级缓存架构:性能与数据一致性的平衡处理(原理及优势详解+项目实战) - 教程
  • 微信社群开发
  • mysql设置最大连接数,MySQL最大连接数设置详解
  • c# 读取xml到datagridview
  • 微信机器人API开放!手把手教你打造智能聊天机器人
  • 十二重计数法
  • KLT就是Android中开一个线程是ULT还
  • Java高手速成--吃透源码+手写组件+定制开发
  • 【Excel】账单数据分析(数据透视表的简单应用)