一、TS中定义类
新建一个ts文件,
class Dog {constructor(name: string) {this.name = name;}public name: string = "dog"}let dog = new Dog('wangwang');console.log(dog)
class Pointer{x!:number; // 实例上的属性必须先声明y!:number;constructor(x:number,y?:number,...args:number[]){this.x = x;this.y = y as number;}}let p = new Pointer(100,200, 2);console.log(p)
实例上的属性需要先声明在使用,构造函数中的参数可以使用可选参数和剩余参数
二、类中的修饰符
1、修饰符的写法
class Animal {constructor(name: string, age: number) {this.name = name;this.age = age;}public name: string; // 不写public默认也是公开的public age: number;}
通过参数属性来简化父类中的代码
class Animal {constructor(public name: string, public age: number) {this.name = name;this.age = age;}}
可以直接在构造函数前面添加修饰符
class Animal {public constructor(name: string, age: number) {this.name = name;this.age = age;}}
2、修饰符用法
1、public修饰符 公共成员
public修饰符(谁都可以访问到)
class Animal {constructor(name: string, age: number) {this.name = name;this.age = age;}public name: string; // 不写public默认也是公开的public age: number;}class Cat extends Animal{constructor(name: string, age: number) {super(name, age);console.log(this.name, this.age); // 子类访问(public修饰的可以访问)}}let c = new Cat('Tom', 18);console.log(c.name, c.age); // 外部访问(public修饰的可以访问)
2、protected修饰符 受保护成员
protected修饰符 (自己和子类可以访问到)
class Animal {constructor(protected name: string, protected age: number) {this.name = name;this.age = age;}}class Cat extends Animal {constructor(name: string, age: number) {super(name, age);console.log(this.name, this.age, '===子类'); // 子类访问(protected 可以访问)}}let c = new Cat('Tom', 18);console.log(c.name, c.age, '==外部访问'); // 外部访问(protected 无法访问)
3、private修饰符 私有成员
private修饰符 (除了自己都访问不到)class Animal {constructor(private name: string, private age: number) {this.name = name;this.age = age;}}class Cat extends Animal {constructor(name: string, age: number) {super(name, age);console.log(this.name, this.age); // 无法访问}}let p = new Cat('Tom', 18);console.log(p.name,p.age);// 无法访问
4、readonly修饰符 只读成员
readonly修饰符 (仅读修饰符)class Animal {constructor(public readonly name: string, public age: number) {this.name = name;this.age = age;}changeName(name:string){this.name = name; // 仅读属性只能在constructor中被赋值}}class Cat extends Animal {constructor(name: string, age: number) {super(name, age);}}let p = new Cat('Tom', 18);p.changeName('Jerry');
三、静态属性和方法
静态属性和静态方法是可以被子类所继承的;
静态属性只能通过类名来调用,不能通过子类调用; ```typescript class Animal { static type = ‘哺乳动物’; // 静态属性 static getName() { // 静态方法return '动物类';
} private _name: string = ‘Tom’;
get name() { // 属性访问器
return this._name;
} set name(name: string) {
this._name = name;
} } let animal = new Animal(); console.log(animal.name);
// 静态属性只能通过类名来调用,不能通过子类调用; console.log(Animal.type); // 可以访问 console.log(animal.type); // 不能访问
<a name="oOLyo"></a>## 四、抽象类所谓抽象类就是**只能被继承不能被实例化的类。**<br />**<br />抽象类无法被实例化,只能被继承,抽象方法不能在抽象类中实现,只能在抽象类的具体子类中实现,而且必须实现。```typescript// abstract 定义抽象类abstract class Animal {eat(){console.lig('eat');}}class Dog extends Animal {constructor(name: string) {super();this.name = name;}name: string;run(){}}let dog = new Dog('ww')dog.eat();
类的多态和链式调用
class Animal {
eat(){
console.lig('eat');
}
}
let animals: Animal[] = [dog, cat];
animals.forEach(a => {
a.eat()
})
class WorkFlow {
step1(){
return this;
}
step2(){
return this;
}
}
new WorkFlow().step1().step2();
// 保证父类子类调用的连贯性
class Myflow extends WorkFlow {
next() {
return this;
}
}
new Myflow().next().step1().step2();
四、super属性
class Animal {
say(message:string){
console.log(message);
}
static getType(){
return '动物'
}
}
class Cat extends Animal {
say(){ // 原型方法中的super指代的是父类的原型
super.say('猫猫叫');
}
static getType(){ // 静态方法中的super指代的是父类
return super.getType()
}
}
let cat = new Cat();
console.log(Cat.getType())
五、类的装饰器
1.装饰类
function addSay(target:any){
target.prototype.say = function(){console.log('say')}
}
@addSay
class Person {
say!:Function
}
let person = new Person
person.say();
