TS-属性修饰符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
    (function () {
/**
* 属性封装修饰符
* @public 属性默认修饰符,默认值,类实例,子类,子类实例无限制访问 public 属性
* @private 对象实例不能访问、修改对象属性,子类及子类实例都不能访问私有属性,但可以通过@访问器属性 访问
* @protected 类实例无法访问受保护属性,子类可以访问受保护属性, 但子类实例不可以,子类实例可以通过 @访问器属性 访问受保护属性
* @访问器属性 解决了私有属性不能访问和修改私有属性的问题
* @访问器属性 可以在修改值时,可以添加非法值验证
*/
class Property {
private _age: number;
public _public: string = 'public' // 默认公有属性
protected _protect: string = 'protect' // 受保护的属性

constructor(age: number) {
this._age = age
}

// getAge() {
// return this.age
// }

// setAge(n: number) {
// // 添加非法验证
// if (!n) return
// this.age = n
// }

// 访问器属性 getter
// 访问器仅在面向 ECMAScript 5 和更高版本时可用。ts(1056)
// Error: Accessors are only available when targeting ECMAScript 5 and higher.
get age() {
return this._age
}

// 访问器属性 setter
set age(n: number) {
if (!n) return
this._age = n
}
}

let pete = new Property(1)
// 修改属性值
// console.log(pete, pete.name, pete.age) // 对象实例不能访问私有属性
// pete.name = 'fly guy' // Property 'name' is private and only accessible within class 'Property'
// pete.setAge(3)
// console.log(pete, pete.getAge())
pete.age = 10 // 访问器属性可以直接通过赋值的方式修改属性值

class Encapsulate extends Property {
get_public() {
return this._public // 子类访问父类 public 属性
}

get protected() {
return this._protect // 子类访问父类 protected 属性
}

// get pravite() {
// return this._age // 子类访问父类不能访问 pravite 属性
// }
}

let encapsulate = new Encapsulate(1)
console.log(encapsulate._public, '子类实例访问父类公共属性')
console.log(encapsulate.age, '子类实例可以访问父类私有属性')
console.log(encapsulate.protected)
// console.log(encapsulate._protect, '子类实例可以访问父类受保护属性')


// 声明类时,构造函数直接声明入参,无需再次赋值
class Sample {
// 注意:入参必须注明属性修饰符
constructor(public t: string) { }
}
let s = new Sample('test')
console.log(s.t)
})()