关于前端:Typescript-的那些小细节或者说小坑private的封装性

38次阅读

共计 635 个字符,预计需要花费 2 分钟才能阅读完成。

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

正文完
 0