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