请解释一下为什么在TS类中,private为一个字段/方法(以下简称PM)指定时,转成JS文件后,#PM前没有符号?
@AlexeyTen评论说,在 TS 中它只是纯粹的“装饰性”,你不能只是去换另一个。并在 GitHub 上留下了讨论这个问题的链接
在那里,TS 开发负责人给出了以下答案。因为 我没听懂所有的单词,所以我用谷歌翻译器和Reverso服务为自己翻译,结果是这样的:
我们目前的计划是保留当前的私人行为。
原因:
- 我们不会无缘无故地进行重大更改,也没有任何外部因素使人们放弃编译时间
private- 仅在编译时有非常好的隐私用例:
private可以从单元测试中读取字段(我意识到有些人觉得这很烦人,但它并不普遍。)private字段在较低级别的脚本中具有更好的运行时性能- 很多人不喜欢语法
#,所以为什么要强加给他们- 没有
WeakMap(并非所有运行时都有),就没有很好的降级等价物来执行大量的隐私保护至于变压器,为什么不呢?如果您有动力,它们很容易用正则表达式替换
经过长时间的讨论,其中一位作者开玩笑地举了这样一个例子,这让我更加困惑:
人权:
class Human { #rights; removeRights () { console.log("No"); } } class Government { takeawayRights (human) { human.removeRights(); //No human.rights = undefined; //Not allowed } }人员特权:
class Human { private privileges; removePrivileges () { console.log("No"); } } class Government { takeawayPrivileges (human) { human.removePriveleges(); //No human.privileges = undefined; //OK! } }
事实证明,尽管是首相private,我仍然可以冷静地直接联系他,随心所欲地改变。
老实说,我在那里读了很多书,至少不完全,但是 + - 我完全理解它是如何工作private的,但我仍然不明白:为什么它会这样工作?private在 TS 中它不像#在 JS中那样工作的原因是什么
如果你能用手指解释我会很高兴:)
确切地。TS 最初被认为是运行时不存在的 JS 的附加组件。因此,
private仅在编译时检查对字段的访问,但如果您设法“绕过”编译器,那么在编译的 JSprivate中,该字段与public.在您的最后一个示例中,TS 编译器将抱怨带有
human.privileges = undefined;错误的行Property 'privileges' is private and only accessible within class 'Human'.。