精进TypeScript--private真的能隐藏信息吗?

JavaScript缺乏一种使类的属性成为私有的方法。
private访问修饰符只有通过类型系统才能被强制执行。它在运行时没有效果,可以被一个类型断言轻松绕过。不要以为它能保持数据的隐蔽性。

通常的变通方法是将下划线作为不属于公共API的字段的前缀:

class Foo {_private = 'secret';
}
// 但这只是建议用户不要访问私人数据,且容易绕开
const f = new Foo();
f._private; // 'secret'

TypeScript增加了public、protected和private访问修饰符,似乎提供了一些强制执行的功能:

class Bar {private secret = 'secret info';
}const bar = new Bar();
bar.secret // ~~ 属性secret为私有属性,只能在类Bar中访问

但是private是类型系统的一个特性,而且和类型系统中的所有特性一样,它在运行时就不见了。上面代码编译成JavaScript:

class Bar {constructor() {this.secret = 'secret info';}
}
const bar = new Bar();
bar.secret // OK

private修饰符消失的,secret也就暴露了。就像_private惯例一样,TypeScript的访问修饰符只会组织你访问私有数据。通过类型断言,你也可以访问私有属性:

class Bar {private secret = 'secret info';
}const bar = new Bar();
(bar as any).secret // OK

所以,不要依赖私有访问修饰符private来隐藏信息!

那么,应该怎么做呢?传统的方式是利用JavaScript可靠的隐藏信息的方法之一–闭包。你可以在构造函数中创建一个闭包:

declare function hash(text: string): number;class PasswordChecker {checkPassword: (password: string) => boolean;constructor(passwordHash: number) {this.checkPassword = (password: string) => {return hash(password) === passwordHash;}}
}const checker = new PasswordChecker(hash('s3cret'));
checker.checkPassword('s3cret'); // 返回true

JavaScript没有提供从PasswordChecker的构造函数之外访问passwordHash变量的方法,但这有一个缺点:因为passwordHash在构造函数之外是不可见的,所以每个使用它的方法也必须在那里定义。这就导致每个类的实例都要创建一个方法副本,从而导致更高的内存使用量。它还会阻止同一类的其他实例访问私有数据。闭包可能是不方便的,但它肯定会保证你的数据的私密性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/784750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++经典面试题目(十五)

1、什么是面向对象编程(OOP)?请解释其基本概念。 当谈论面向对象编程(OOP)时,我们指的是一种软件开发范式,其中程序被组织为一组对象的集合,这些对象之间通过消息传递来进行交互。 …

索引失效的场景有哪些

索引失效的场景有以下几种: 1.联合索引非最左匹配:当使用联合索引时,未遵循最左匹配原则,则不能正常使用索引,也就是索引失效了 2.不当模糊查询:模糊查询 like 的常见用法有3种(只有第1种的会走索引,其他都会导致索引失效): a.模…

力扣刷题Days29-128.最长连续数列(js)

目录 1,题目 2,代码 2.1自己实现 2.2哈希表 3,学习与收获 枚举思想: 遍历的核心逻辑 碎碎念 本题 先是想到利用数组排序,从而简化遍历处理逻辑,再在提交错误提醒的情况下,考虑到数组中存…

zookeeper如何保证数据强一致性的?

原子广播特性用来保证zookeeper集群数据强一致性的机制。 数据的强一致性是当一个外部客户端去请求一个分布式系统中的数据时一旦这个数据允许被查询,那么我们在任何一个被要求存储该数据的分布式节点上在任何时候都能够查到这份数据且数据内容要求一摸一样。 原子广…

基于FreeRTOS系统的STM32简易遥控器设计

项目说明 该项目是一个基于FreeRTOS系统的Stm32遥控器设计。使用该项目主要是自己学习FreeRTOS的使用,以及模块化编程的思想。这个项目应该长期会有更新。 项目开源 github:https://github.com/snqx-lqh/Stm32RemoteControl gitee:https://gitee.com/snqx-lqh/S…

Electron安全防护实战:应对常见安全问题及权限控制措施

Electron安全防护实战:应对常见安全问题及权限控制措施 引言常见安全问题及其危害提升 Electron 应用安全性的措施限制渲染进程权限防止XSS与内容注入加固应用更新流程严格管理硬件权限使用安全的第三方模块加密敏感数据存储实现进程间通信(IPC&#xff…

【无标题】331

2024年3月31日19:26:09 和一个好感度为40的女生完成了一次基础的对话 2024年3月31日19:26:26 在群里完成了一个毫无所谓的对话 2024年3月31日19:40:04开始准备写论文了 2024年3月31日19:40:11好感度为40的女生回复了我本质上是回复率只有40的人回复了我那应该感到高兴才对 …

Github 2024-04-01 开源项目月报 Top20

根据Github Trendings的统计,本月(2024-04-01统计)共有20个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目9TypeScript项目2非开发语言项目2Jupyter Notebook项目2HTML项目1CSS项目1C#项目1Shell项目1Lua项目1JavaScript项目1C项目1Java项目…

程序员赚钱线索,百度的AI灵感中心,有个命理,3.6w人使用

百度的AI灵感中心,有个命理,3.6w人使用。( 比其他全部数据都要高,别人都是几百几千,这一个3.6w属于异常值。 思路: 是否可以根据这个做个插件或者小程序?用ChatGPT接口来进行解梦,…

了解 LoadRunner 性能测试软件及其基础使用

目录 一、了解LoadRunner 1、什么是Loadrunner? 2、Loadrunner包括什么组件? (1)前台组件 (2)后台组件 二、LoadRunner三大组件 1、VuGen(虚拟用户脚本生成器) (…

详细分析Mysql中的STR_TO_DATE基本知识(全)

目录 前言1. 基本知识2. Demo3. 实战Demo4. Sql彩蛋4.1 LPAD函数4.2 SUBSTRING_INDEX函数 5. Java彩蛋 前言 对于该知识点,主要因为数据库类型为String(类似2024-03-26),放置于后端操作后,需要自定义比较,…

【QT+QGIS跨平台编译】054:【exiv2lib_int+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、exiv2lib_int介绍二、文件下载三、文件分析四、pro文件五、编译实践一、exiv2lib_int介绍 exiv2lib_int是 exiv2 这个开源的图像元数据库中的一个组件。 Exiv2是一个开源的C++库,用于读取、编辑和写入图片和视频文件的元数据。它可以处理各种类…

选择Six Sigma咨询公司,看准这几点不踩坑!

在如今的市场环境中,Six Sigma作为一种追求卓越的管理方法,受到了越来越多企业的青睐。然而,面对众多的Six Sigma咨询公司,企业往往感到困惑:究竟哪家公司更适合自己?今天,我们就来聊聊如何挑选…

【Groovy系列 一】Groovy数据类型(字符串、数值型、集合、数组、Map)

0.前言 在这里记录了Groovy的基础简介,本系列开始对Groovy的进一步学习 https://blog.csdn.net/weixin_44484715/article/details/137221630 安装Groovy成功后,有两种运行Groovy的方式: 在Groovy安装目录/bin目录下,有一个groov…

Unity构建详解(4)——SBP的依赖后处理

【AddHashToBundleNameTask】 这个Task的作用很明确,给Bundle的名字附加一个Hash值: 根据bundle所包含的asset计算出来一个hash值添加在原来Bundle的末尾替换了BundleBuildContent.BundleLayout和aa.bundleToAssetGroup中的key 有两个问题&#xff0c…

ES2024即将发布!5个可能大火的JS新方法

文章目录 01:Promise.withResolvers02:Object.groupBy()03:Temporal04:Records 和 Tuples05:装饰器(Decorators)其他 ECMAScript 2024(ES15) 即将发布(2024年…

【数字IC/FPGA】手撕代码:模3检测器(判断输入序列能否被3整除)

今天我们来手撕一个常见的笔试题,使用的方法是三段式Moore状态机。 题目描述: 输入端口是串行的1bit数据,每个时钟周期进来一位新数据后,实时检查当前序列是否能整除3,若能则输出1,否则输出0。 例如&#…

【Redis 二】Redis客户端(Jedis、SpringDataRedis、RedisTemplate)

1. Redis客户端 Jedis 以redis命令作为方法名称,学习成本低,但是Jedis实例是线程不安全的,多线程环境下需要基于连接池来使用(必须为每个线程分配独立的Jedis连接) lettuce 基于Netty实现,支持同步、异步和…

“花小钱”解决竞赛训练“大问题”,赛宁首发竞赛专项练习本AdBook

想在网络安全竞赛上取得好成绩的你,还在为下面这些问题犯难吗? 1-专业竞赛平台价格过高,没有充足预算购买! 2-现有练习平台和竞赛比赛平台不一样,没法提前去现场训练! 3-题海战术费事费力,没法…

Java 面试宝典:请说下你对 Netty 中Reactor 模式的理解

大家好,我是大明哥,一个专注「死磕 Java」系列创作的硬核程序员。 本文已收录到我的技术网站:https://skjava.com。有全网最优质的系列文章、Java 全栈技术文档以及大厂完整面经 回答 Reactor 模式是一种高效处理并发网络事件的设计模式&…