4、typescript中的类

/**

* 1、类的定义

* 2、继承

* 3、类里面的修饰符

* 4、静态属性 静态方法

* 5、继承多态、抽象类、抽线方法

*/

1、ts中定义类

es5:
function Person(nanme){
    this.name = name;
    this.run = function(){
        console.log(this.name)
    }
}
var p = new Person('张三');
p.run()
typescript:
class Person{
    name:string;    //属性  前面省略了public关键词
    constructor(n:string){  //构造函数  实例化类的时候出发的方法
        this.name = n;
    }
    run():void{
        alert(this.name+'在做运动');
    }
}
var p = new Person("张三");
p.run();
typescript给类中添加方法:
class Person{
    name:string;
    constructor(name:string){
        this.name = name;
    }
    getName():string{//定义方法取值
        return this.name;
    }
    setName(name:string):void{//方法传值 改变属性
        this.name = name;
    }
}
var p = new Person("张三");
alert(p.getName());
p.setName('李四');
alert(p.getName()); 

2、ts中实现继承 extends super

class Person{
    name:string;
    constructor(name:string){
        this.name = name;
    }
    run():string{
        return `${this.name}在运动`
    }
}
var p = new Person('王五');
alert(p.run())

class Web extends Person{
    constructor(name:string){
        super(name);//初始化父类的构造函数
    }
}
var w = new Web('李四');
alert(w.run())

// ts中继承的探讨 父类的方法和字类的方法一致

class Person{
    name:string;
    constructor(name:string){
        this.name = name;
    }
    run():string{
        return `${this.name}在跑步`
    }
}
class Web extends Person{//继承父类的属性和方法
    constructor(name:string){
        super(name);//初始化父类的构造函数
    }
    // 现在字类里面找 再去父类里面找
    run():string{
        return `${this.name}在跑步-字类`
    }
    // 还能扩展自己的方法
    work(){
        alert(`${this.name}在工作`)
    }
}
var w = new Web('李四');
w.work();
w.run();

  先在子类里面找 再去父类里面找

3、类里面的修饰符

typescript里面定义属性的时候给我们提供了三种修饰符

/*

public:共有 在类里面、字类、类外面都可以访问

protected:保护类型 在类里面、字类里面可以访问,在类外部没法访问

private:私有 在类里面可以访问、字类和类外部没法访问

 注:

属性如果不加修饰符 默认时public

*/

class Person{
    public name:string;
    constructor(name:string){
        this.name = name;
    }
    run():string{
        return `${this.name}在运动`
    }
}

class Web extends Person{
    constructor(name:string){
        super(name);//初始化父类的构造函数
    }
    // 还能扩展自己的方法
    work(){
        alert(`${this.name}在工作`)
    }
}
// public
var w = new Web('王五');//public name:string;
w.work();

// protected
var w = new Web('李四111');//protected name:string;
alert(w.work());//李四111在工作 在字类中可以访问
alert(w.run());//李四111在运动  在父类中可以访问
var p = new Person('哈哈哈');alert(p.name)//p.name可以编译 但是会报错,控制台上也有提醒,name是保护类型。

// private

4、静态属性 静态方法

es5静态方法和属性

function Person(){
    this.run1=function(){

    }
}
Person.name='哈哈哈';//静态属性
Person.run2=function(){//静态方法

}
var p=new Person();
Person.run2();//静态方法的调用
$('#box').css('color','red');
function $(ele){
    return new Base(ele);
}
function Base(ele){
    this.ele = 获取dom节点;
    this.css=function(arr,val){//实例方法
        this.ele.style.arr = val;
    }
}
// 静态方法调用
$.get('url',function(){

})
// 定义静态方法
$.get=function(){

}

 ts中的静态方法和属性

class Person {
    name:string;
    static age:number=20;//静态属性
    constructor(name:string) {
        this.name = name;
    }
    run(){//实例方法
        alert(`${this.name}在运动`)
    }
    work(){//实例方法
        alert(`${this.name}在共工作`)
    }
    static print(){//静态方法
        // 没法直接调用类里面的属性
        alert('静态方法'+this.name);
        // 需要定义静态属性才能访问Person.age
        alert('静态方法'+Person.age);
    }
}
Person.print();//静态方法调用
alert(Person.age);//静态属性调用

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+'吃粮食';
    }
}
class cat extends Animal {
    constructor(name:string) {
        super(name);
    }
    eat(){
        return this.name+'吃老鼠';
    }
}

抽象方法 抽象类

typeScript中的抽象类:他是提供其他类继承的基类,不能直接被实例化。

var a =new Animal();//无法创建抽象类的实例

用abstract关键字定义抽象类和抽象方法,抽象类中的抽象方法不包含具体实现并且在派生类中实现。

class Animal {  //抽象方法只能放在抽象类中
  abstract eat():any;
 }

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

// Animal这个类要求其他的字类必须包含eat方法

// 抽象方法实现多态

abstract class Animal {
    name:string;
    constructor(name:string){
        this.name = name;
    }
    abstract eat():any;//抽象类中的抽象方法不包含具体实现并且在派生类中实现。
    run(){
        console.log('其他方法可以不实现');
    }
}
//var a =new Animal();//错误写法 无法创建抽象类的实例

class Dog extends Animal {
    constructor(name:any){
        super(name);
    }
    // 抽象类的子类必须实现抽象类里面的抽象方法
    eat(){
        console.log(this.name + '吃粮食')
    }
}
var d=new Dog('小黑');
d.eat();

class Cat extends Animal {
    constructor(name:any){
        super(name);
    }
    // 抽象类的子类必须实现抽象类里面的抽象方法
    eat(){
        console.log(this.name + '吃老鼠')
    }
}
var c=new Cat('小花猫');
c.eat();