四、TypeScript中的类

202 阅读3分钟

回顾js中定义类

function Person(name){
    this.name = name;
    this.run = function(){
        console.log(this.name);
    }
}
var p = new Person('zhangsan');
p.run();

1、ts中定义class类

class Person {
    name: string; //省略public关键词
    constructor(name:string){ //构造函数,实例化类的时候触发的方法
        this.name = name;
    }
    run():void {
        alert(this.name)
    }
    getName():string{
        return this.name;
    }
    setName(name:string): void {
        this.name = name;
    }
}

//实例化
var p = new Person('zhangsan');
p.run();//zhangsan
p.getName();//zhangsan
p.setName('lisi');
p.getName();//lisi

2、ts中实现继承类,extend、super

class Web extends Person {
    constructor(name:string){
        super(name);//初始化父类的构造函数
    }
    run():string {
        return `${this.name} is running`
    }
    work(){
        alert(`${this.name} is working`)
    }
}
var w = new Web('李四');
//子类继承了父类的方法就可以使用父类的方法,并且可以拥有自己的方法
//子类和父类方法重复时会使用自己的方法
w.run();//李四 is running
w.work();//李四 is working

3、类的修饰符

ts定义了三种修饰符:

public 公有,在当前类里面,子类,类外面都可以访问

protected 保护类型,在当前类里面,子类可以访问,类外面不能访问

private 私有类型,在当前类里面可以访问,子类,类外面不能访问

默认不写就是public

关于public:

class Person {
    public name: string; 
    constructor(name:string){ 
        this.name = name;
    }
    run():string {
        return `${this.name} is running`
    }
}

//实例化
var p = new Person('zhangsan');
// 类里面可以访问
console.log(p.run());//zhangsan is running
// 类外可以直接访问public修饰符修饰的属性
console.log(p.name); //zhangsan
// 子类可以访问(不举例了)

关于protected:

//父类
class Person {
    protected name: string; 
    constructor(name:string){ 
        this.name = name;
    }
    run():string {
        return `${this.name} is running`
    }
}
//实例化
var p = new Person('zhangsan');
// 类里面可以访问
console.log(p.run());//zhangsan is running
// 类外面不能访问
console.log(p.name); //编译报错

//子类
class Web extends Person {
    constructor(name:string){
        super(name);//初始化父类的构造函数
    }
}
var w = new Web('李四');
// 子类可以访问父类protected的属性
console.log(123,w.run());//李四 is running

image.png

image.png ts文件是编译成js文件时会有报错信息,但是浏览器可以看到结果,因为浏览器执行的是编译后的js文件

关于private:

//父类
class Person {
    private name: string; 
    constructor(name:string){ 
        this.name = name;
    }
    run():string {
        return `${this.name} is running`
    }
}
//实例化
var p = new Person('zhangsan');
// 类里面可以访问
console.log(p.run());//zhangsan is running
// 类外面不能访问private的属性
console.log(p.name); //编译报错

//子类
class Web extends Person {
    constructor(name:string){
        super(name);//初始化父类的构造函数
    }
    work(){
        // 子类不可以访问父类private的属性
        alert(`${this.name} is working`);//编译报错
    }
}
var w = new Web('李四');

image.png

4、类定义静态属性和静态方法

回顾js中类的静态属性和方法

function Person(){
    //实例方法,实例化之后才能调用
    this.run1 = function(){
        return 'llll'
    }
}
//静态属性和方法,不用通过实例化就可以调用
Person.name = 'hhh';
Person.run2 = function(){

}
console.log(Person.run2())
Person.run1();//编译报错

通过jquery理解的话就是

function $(element){
    return new Base(element)
}
//$的静态方法,使用的时候直接调用
$.get = function(){}
$.get();
function Base(element){
    this.element = element;
    this.css = function(attr,value){
        this.element.style.attr = value;
    }
}
// 需要实例化调用css()
$('#box').css('color','red');

ts中的静态属性和方法

class Person{
    name: string;
    age: number;
    //静态属性
    static sex:string = 'boy';
    constructor(name){
        this.name = name;
    }
    run(){
        return `${this.name} is running`
    }
    //静态方法
    static print(){
        return 'print '+Person.sex;
        // 静态方法内部不能直接调用类里面的属性
        // return 'print '+ age; //编译报错
    }
}
//外部直接调用静态属性和方法
console.log(Person.sex);//boy
console.log(Person.print());//print boy

5、多态

多态: 父类定义一个方法不去实现,让继承他的子类去实现,每一个子类有不同的表现

多态属于继承


class Animal {
    name: string;
    constructor(name: string){
        this.name = name;
    }
    eat(){ //让继承她的子类去实现,具体吃什么
        console.log('吃的方法')
    }
}

class Dog extends Animal {
    constructor(name: string){
        super(name);
    }
    eat(){
        //具体的
        return this.name + ' 狗粮';
    }
}
var dog = new Dog('汪汪汪');
console.log(dog.eat()); //汪汪汪 狗粮

6、抽象方法和抽象类

抽象类和抽象方法用来定义标准

  1. 抽象方法只能放在抽象类里面。

    换句话说就是Animal这个类里面要定义eat抽象方法的话,就必须要求Animal这个类是抽象类

  2. 抽象类提供继承的基类,不能直接被实例化,直接实例化会报错。

  3. 用abstract 关键字定义抽象类和抽象方法,抽象类中的抽象方法不包含具体实现且必须在子类中实现。

    换句话说就是eat这个抽象方法具体要做什么不能在Animal里面写,要在它的子类里面写,所以子类必须包含eat方法

abstract class Animal {
    public name:string;
    constructor(name: string){
        this.name = name;
    }
    abstract eat(): any;//不包含具体实现
}
// var a = new Animal()//错误写法

class Dog extends Animal {
   //抽象类的子类必须实现抽象类里面的抽象方法
   constructor(name: string){
        super(name);
    }
    eat() {
        return this.name + ' 狗粮';//抽象方法必须在派生类里面实现
    }
}
var d = new Dog('旺旺')
console.log(d.eat());//旺旺 狗粮