private的封装性,先来看一段代码
class Test{ private a:string public b:string constructor(){ this.a = "aaa" this.b="bbbb" } } let test = new Test() console.log(test) console.log(test.a)
依照我的想法,private是公有属性,只能在外部被拜访,然而为什么 我实例化之后console进去的时候会有这个公有属性?
实在我的项目中private的属性和办法理论是不想裸露给用户的,然而console.log外面能打印进去真的很好受,并且恶心的是,在TS代码编译成为JS之后,console.log(test.a)竟然能够打印进去类的公有属性。
通过一番钻研,原来:
- private 是 ts 中一开始就有的语法,而且目前只有 ts 有,ES 标准没有。
- ts只关注编译时,不关注运行时。
private 编译之后,就失去了公有的特点。即,如果你执行 (new Test()).a ,尽管语法查看不通过,但运行时是能够胜利的。即,private 仅仅是 ts 的语法,编译成 js 之后,就生效了
正在不知道咋个办的时候,就找到了另外一个货色----#
它也是示意公有属性,和private不同的是,#编译之后,仍然具备公有特点,(new Test()).a在运行时候也是无奈实现,然而他任然会被打印进去,然而在编译后果中,然而#号的公有性,是通过 WeekMap 来实现的,所以要确保你的运行时环境反对 ES6