1

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出来的时候会有这个私有属性?
image
真实项目中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


罗鼎
57 声望4 粉丝