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

2024-04-01 08:28

本文主要是介绍精进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在构造函数之外是不可见的,所以每个使用它的方法也必须在那里定义。这就导致每个类的实例都要创建一个方法副本,从而导致更高的内存使用量。它还会阻止同一类的其他实例访问私有数据。闭包可能是不方便的,但它肯定会保证你的数据的私密性。

这篇关于精进TypeScript--private真的能隐藏信息吗?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/866686

相关文章

一文详解SQL Server如何跟踪自动统计信息更新

《一文详解SQLServer如何跟踪自动统计信息更新》SQLServer数据库中,我们都清楚统计信息对于优化器来说非常重要,所以本文就来和大家简单聊一聊SQLServer如何跟踪自动统计信息更新吧... SQL Server数据库中,我们都清楚统计信息对于优化器来说非常重要。一般情况下,我们会开启"自动更新

Python如何获取域名的SSL证书信息和到期时间

《Python如何获取域名的SSL证书信息和到期时间》在当今互联网时代,SSL证书的重要性不言而喻,它不仅为用户提供了安全的连接,还能提高网站的搜索引擎排名,那我们怎么才能通过Python获取域名的S... 目录了解SSL证书的基本概念使用python库来抓取SSL证书信息安装必要的库编写获取SSL证书信息

Win32下C++实现快速获取硬盘分区信息

《Win32下C++实现快速获取硬盘分区信息》这篇文章主要为大家详细介绍了Win32下C++如何实现快速获取硬盘分区信息,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实现代码CDiskDriveUtils.h#pragma once #include <wtypesbase

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如