TS第3天 Tpeyscript面向对象

4 篇文章 0 订阅

面向对象 OOP

一切皆对象

config.json中配置

{
    "compilerOptions": {
        "module":"es2015",
        "target": "ES2015"
    }
}

命令

tsc -w    //全局监听并自动编译

02.ts 文件

static 关键字用于定义类的数据成员(属性和方法)为静态的,静态成员可以直接通过类名调用。

static readonly
static :静态方法,只能类访问or 调用
readonly :只读,只能访问属性,不能修改属性

class person{          //person  类
    name:string="df"
    readonly age:number= 18   //只读不能修改
    static sex:string = "男"   //静态属性 只能类访问,实例不能访问
    
    say() {
        console.log('hi');
    }
}

const p = new person()    //p 实例
console.log(p.name,)
console.log(person)
console.log(p.sex);  报错  //static静态属性不能用实例访问和编辑,只能类访问
person.sex ="女"   
console.log(person.sex);
person.age = 20   //报错,readonly 只读  不能修改
 
 p.say();   //同理  static  只能类调用

构造函数 和 this

this: 在类中,使用this表示当前对象

class Dog{
    name:string
    age:number

    //构造函数会在对象创建时调用
    constructor(name:string,age:number){
      //在实例方法中,this就是当前的实例  
      //在构造函数中,当前对象就是当前新建的那个对象
      //可以通过this向新建的对象中添加属性
        this.name = name;
        this.age =age;
    }

    bark(){
        //在方法中this表示当前调用方法的实例对象
        console.log(this)
    }
}
const dog1 = new Dog('小黑',4)
const dog2 = new Dog('小白',5)

console.log(dog1.bark())//Dog {name: '小黑', age: 4}
console.log(dog2.bark());//Dog {name: '小小', age: 5}

dog1调用 this 就执行dog1 ,dog2调用 this 就执行dog2

extends 继承

子类可以对父类的方法重新定义,这个过程称之为方法的重写。

class Animal{
    name:String
    age:number
    constructor(name:string,age:number){
        this.name = name;
        this.age =age
    }
    say(){
        console.log('动物在叫~~~');
    }
}

//使用继承后,子类将拥有父类所有的 方法和属性
//通过继承可以将多个类中共有的代码写在一个父类中
//可以在子类中添加父类没有的 属性和方法

class Dog1 extends Animal{
  return (){
    console.log(`${this.name}在跑~~~`)
  }
}
class Cat extends Animal{
   say(): void {
     console.log('我是小猫~~~');   //重写了父类的方法
   }
}

const dog = new Dog1("小狗",3)
const cat = new Cat("小猫",2)
console.log(dog);  //Dog1 {name: '小狗', age: 3}
console.log(cat);  //Cat {name: '小猫', age: 2}
console.log(dog.say())   //动物在叫~~~
console.log(cat.say())   //我是小猫~~~

super

super 关键字是对父类的直接引用,该关键字可以引用父类的属性和方法。

class Animal2{
    name:string
    constructor(name){
        this.name = name;
    }
    say(){
        console.log('动物在叫~~~')
    }
}

class Dog2 extends Animal2{
    age:number
    //在子类中写了构造函数,这时候必须在子类构造函数中用super调用一下父类的(理解成会把父类的覆盖)
   constructor(name:string,age:number){
    super(name)
    this.age = age
   }

}

const dog3 = new Dog2("小狗",3)
console.log(dog3.age)   //3
console.log(dog3.name)   //小狗

abstact

  • 抽象类,只能被其他类所继承不能用来创建实例,抽象类就是专门用来被继承的
  • 抽象方法:在抽象类中,没有方法体,子类继承抽象类时抽象方法必须要实现,(换句话说就是规定子类必须重写或者说有的方法)
// 抽象类,不能用来创建对象,抽象类就是专门用来被继承的
abstract class Animal3 {
    name:string
    constructor(name) {
        this.name = name;
    }
    abstract  say() :void;   //抽象方法只能在抽象类里,抽象方法没有方法体,子类必须重写
        
    
}
class Dog3 extends Animal3 {

     age:number
    constructor(name, age) {
        super(name);
        this.age = age;
    }
    say() {
     console.log('dddd')    //子类必须有父类的say()方法 ,不然就报错
    }
}
const dog4 = new Dog3("小狗", 3);
console.log(dog4.age);
console.log(dog4.name);

interface

  • interface 定义接口,就相当于规定了一个类的结构
  • implements 实现接口
//接口只定义对象的结构,不考虑实际值
//在接口中所有的方法都是抽象方法。(抽象方法就是必须在子类中重写)

interface myInter{
    name:string
    say():void;
}

class myClass implements myInter{
    name: string;
    constructor(name){
        this.name = name
    }
    say() {   //如果不定义该方法会报错,因为接口中有定义
        console.log(this.name)
    }
}

const myclass = new myClass('xiaod');
myclass.say()   // xiaod

属性封装

static:静态属性 明为static的属性或方法不再属于实例,而是属于类的属性;
readonly :只读属性,如果在声明属性时添加一个readonly,则属性便成了只读属性无法修改,
修饰符:
public(默认值),可以在类、子类和对象中修改
protected ,可以在类、子类中修改
private ,可以在类中修改

constructor 语法糖

class M{
    constructor(public name:string,public age:number){
    }
    say(){
        console.log('dddd');
    }
}

等价于

class M{
    public name:string
    public age:number
    constructor(name:string,age:number){
        this.name = name 
        this.age =age
    }
}

public

class M {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    say() {
        console.log('dddd');
    }
}
class N extends M {
    constructor(name, age) {
        super(name, age);
        this.name = name; //可以在子类中修改
    }
}
const n = new N('cc', 11);
n.name = "bb"; //可以在对象中修改
console.log(n.name);

protected

class M{
    constructor(protected name:string,protected age:number){

    }
    say(){
        console.log('dddd');
    }
}
class N extends M{
   constructor(name:string,age:number){
    super(name,age);
    this.name =name  //可以在子类中修改
   }
}
const n = new N('cc',11)
n.name="bb"  // 这里报错,不可以通过对象修改

provide

class M{
    constructor(private name:string,private age:number){

    }
    say(){
        console.log('dddd');
    }
}
class N extends M{
   constructor(name:string,age:number){
    super(name,age);
    this.name =name  //报错,不可以在子类中修改
   }
}
const n = new N('cc',11)
n.name="bb"  // 这里报错,不可以通过对象修改

属性存取器

  • 对于一些不希望被任意修改的属性,可以将其设置为private 直接将其
  • 设置为private将导致无法再通过对象修改其中的属性
  • 我们可以在类中定义一组读取、设置属性的方法,这种对属性读取或设置的属性被称为属性的存取器
  • 读取属性的方法叫做setter方法,设置属性的方法叫做getter方法
class Person{
    private _name: string;

    constructor(name: string){
        this._name = name;
    }

    get name(){
        return this._name;
    }

    set name(name: string){
        this._name = name;
    }

}

const p1 = new Person('孙悟空');
// 实际通过调用getter方法读取name属性
console.log(p1.name);
// 实际通过调用setter方法修改name属性 
p1.name = '猪八戒'; 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值