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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。