Class Public Instance Fields
{ // Class Public Instance Fields 公共实例字段 class ES13Class { name = 'wudi' age: unknown sex: unknown } const es13class = new ES13Class() console.log('Class Public Instance Fields: ', es13class.name) // Class Public Instance Fields: wudi console.log('Class Public Instance Fields: ', es13class.age) // Class Public Instance Fields: undefined console.log('Class Public Instance Fields: ', es13class.sex) // Class Public Instance Fields: undefined}
Private Instance Fields
Private instance methods and accessors
{ // Private Instance Fields 私有实例字段 // Private instance methods and accessors 私有实例方法和访问器 class ES13Class { #name: string // 私有字段 getName: string constructor(name: string) { this.#name = name this.getName = name } setName() { return `My name is: ${this.#getNameFn()}` } #getNameFn() { return this.#name } } const es13class = new ES13Class('wudi') console.log('Private instance methods and accessors: ', es13class.setName()) // "Private instance methods and accessors: My name is: wudi" console.log('Private instance methods and accessors: ', es13class.getName) // "Private instance methods and accessors: wudi" // console.log('Private instance methods and accessors: ', es13class.#getNameFn()) // error // TS18013: Property '#getNameFn' is not accessible outside class 'ES13Class' because it has a private identifier. // console.log('Private instance methods and accessors: ', es13class1.#name) // error // TS18013: Property '#name' is not accessible outside class 'Info' because it has a private identifier.}
Static class fields and methods
{ // Static class fields and methods 静态公共字段和方法 class ES13Class { #num = 0 static baseNum = 100 // 静态方法可以通过 this 访问静态字段 static baseNumFn = () => this.baseNum * 2 } // 静态字段和方法通过类本身访问 console.log('Static class fields and methods: ', ES13Class.baseNum) // Static class fields and methods: 100 console.log('Static class fields and methods: ', ES13Class.baseNumFn()) // Static class fields and methods: 200 // 实例不能访问静态字段和方法 const es13class = new ES13Class() // console.log(es13class.baseNum) // error // TS2576: Property 'baseNum' does not exist on type 'ES13Class'. Did you mean to access the static member 'ES13Class.baseNumFn' instead?}
Class Static Block 类静态初始化块
{ // Class Static Block 类静态初始化块 let getBaseNum: () => void let getDoubleBaseNum class ES13Class { static base = 50 static #baseNum = this.base * 2 #x constructor(data: number) { this.#x = { data } } static { getBaseNum = () => this.#baseNum * 2 getDoubleBaseNum = (obj: any) => { obj.#x.data *= obj.#x.data return obj.#x } } } console.log('Class Static Block: ', ES13Class.base) // Class Static Block: 50 console.log('Class Static Block: ', getBaseNum()) // Class Static Block: 200 console.log('Class Static Block: ', getDoubleBaseNum(new ES13Class(2)).data) // Class Static Block: 4}
Ergonomic brand checks for Private Fields
{ // Ergonomic brand checks for Private Fields 私有字段检查 class ES13Class { #phone = '189********' static phoneNumber(obj: any) { // 检查 obj 中是否存在 #phone 字段 if (!(#phone in obj)) { return `Not applicable` } return `Phone number: ${obj.#phone}` } } const ES13User = { 'phone': '189********' } console.log('Ergonomic brand checks for Private Fields: ', 'phone' in ES13User) // Ergonomic brand checks for Private Fields: true const ES13NewUser = {} console.log('Ergonomic brand checks for Private Fields: ', 'phone' in ES13NewUser) // Ergonomic brand checks for Private Fields: false const phoneNo = ES13Class.phoneNumber(new ES13Class()) console.log('Ergonomic brand checks for Private Fields: ', phoneNo) // Ergonomic brand checks for Private Fields: Phone number: 189******** const newPhoneNo = ES13Class.phoneNumber({}) console.log('Ergonomic brand checks for Private Fields: ', newPhoneNo) // Ergonomic brand checks for Private Fields: Not applicable}