TypeScript学习笔记——面向对象面向对象简介类class继承与多态1. 继承2. 多态抽象类与接口1. 抽象类2. 接口3. 抽象类与接口的对比属性的封装泛型面向对象简介面向对象是程序设计语言中一个非常重要的思想初次接触是在学习java时当时对于面向对象的学习没有很精通索性借着学习ts的机会认真的研究一下。所谓面向对象首先将对象当做一个名词去理解面向着他开发程序之中的所有操作都需要通过对象去完成举个例子在前端开发中的操作浏览器需要借助window对象操作网页需要使用document对象操作控制台需要借助console对象那么对象是什么呢可以说世间万物都是对象。像是一个人一只猫咪一颗子弹等等都可以抽象成程序中的对象。程序中所有的对象都被分为两个部分数据和功能以一个人为例他的身高、体重、姓名、年龄等属于数据人可以说话、走路、吃饭这些属于人的功能。数据在对象中被称为属性功能则被称为方法类class了解了对象之后我们还要知道在程序中如何创建对象。要想创建对象必须要先定义类所谓类class可以理解为对象的模型程序中可以使用类传递不同的参数创建特定的对象语法class 类名{ 属性名: 类型 ... constructor(参数1: 类型, 参数2: 类型...){ this.属性名 参数 ... } 方法名(){ /*...*/ } }举例定义一个Person类class Person{ name: string; age: number; constructor(name: string, age: number){ this.name name this.age age } walk(){ console.log(this.name 在走路) } } const person new Person(wmh, 18) //实例一个Person对象注可以直接将属性定义在构造函数中关于属性直接定义的属性是实例属性必须通过对象的实例访问person.name wyz使用static关键字修饰表明声明一个静态属性类属性类属性需要直接使用类来调用console.log(Person.静态属性名)使用readonly关键字修饰表明声明一个只读属性只能进行读操作使用public关键字修饰默认值表示可以在任意地方访问使用private关键字修饰私有属性只能在类内部进行访问使用protected关键字修饰只能在当前类和当前类的子类中访问继承与多态1. 继承对于继承这个概念用例子来说明假设在一个程序中需要用到Dog和Cat两个类从构成来看这两个类有许多部分可以共用单独定义的话就会造成代码的冗余此时我们就可以将这两个类的公共部分提取出来定义一个Animal类让Dog和Cat类继承Animal类所有的属性和方法特定的属性方法单独定义这就是继承。// Animal类 class Animal{ name: string; age: number; constructor(name: string, age: number){ this.name name; this.age age; } bark(){ console.log(动物在叫~~) } } // Dog类 class Dog extends Animal{ bark(){ console.log(${this.name}在汪汪叫); } } // Cat类 class Cat extends Animal{} const dog new Dog(旺财, 4); const cat new Cat(小金, 5) dog.bark();此时Dog和Cat类也成为子类、派生类Animal类被称为父类、超类如果在子类中添加了和父类同名的方法则子类会覆盖掉父类的方法这种形式我们称为方法重写在子类的方法中super就表示当前子类的父类如果在子类中写了构造函数则需要在子类的构造函数中调用super(参数)表明调用父类的构造函数2. 多态参考知乎: https://www.zhihu.com/question/30082151.花木兰替父从军摘自知乎抽象类与接口1. 抽象类以abstract修饰的类被称为抽象类与一般的类相比抽象类不能用来创建实例对象只能被其他的类继承抽象类中可以定义抽象方法抽象方法同样以abstract修饰不含方法体只能定义在抽象类中抽象类的子类必须重写抽象方法abstract class Person{ abstract sayHello(): void; //抽象方法 }2. 接口通俗的来说接口就是用来定义一个类的结构限制一个类中需要包含的属性和方法在定义类的时候使用implements关键字实现接口实例interface Person{ name: string; sayHello():void; } class Student implements Person{ constructor(public name: string) { } sayHello() { console.log(大家好我是this.name); } }3. 抽象类与接口的对比抽象类中的方法可以是抽象方法也可以不是接口中的属性方法都只能是抽象的不能有实际值它只是用来限制结构在同一作用域中抽象类不可以重名但接口可以他会合并重名接口中的属性方法一个类只能继承至一个抽象类但可以实现多个接口属性的封装由于常规的定义方式会使得类的属性暴露在外不建议这么做一般会采用对类的属性进行访问的限制private或protected修饰再配合类内部的getter和setter方法对属性进行访问实例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(孙悟空); console.log(p1.name); // 通过getter读取name属性 p1.name 猪八戒; // 通过setter修改name属性泛型定义一个函数或是一个类时有时候会出现无法确定类型的情况包括参数、属性、返回值的类型此时泛型便可以发挥作用举个例子function test(arg: any): any{ return arg; }上例中test函数的参数类型无法确定但可以确定参数和返回值类型相同由于类型不确定所以使用any类型但这样明显是不合适的首先any会关闭ts的类型检查其次这样也无法体现参数和返回值是相同类型这里我们就可以使用泛型function testT(arg: T): T{ return arg; }这里的T就是一个泛型T是这个泛型的名字自定义定义之后即可在函数或类中使用这个泛型泛型其实就表示某个类型对于上述的函数有两种使用方式方式一直接使用视作普通函数test(10)方式二指定类型在函数后制定泛型的类型teststring(wmh)另外可以同时指定多个泛型泛型间使用逗号隔开function testT, K(a: T, b: K): K{ const x a return b; } testnumber, string(10, hello);在类中也可以使用泛型class MyClassT{ prop: T; constructor(prop: T){ this.prop prop; } }
TypeScript学习笔记 - P4
TypeScript学习笔记——面向对象面向对象简介类class继承与多态1. 继承2. 多态抽象类与接口1. 抽象类2. 接口3. 抽象类与接口的对比属性的封装泛型面向对象简介面向对象是程序设计语言中一个非常重要的思想初次接触是在学习java时当时对于面向对象的学习没有很精通索性借着学习ts的机会认真的研究一下。所谓面向对象首先将对象当做一个名词去理解面向着他开发程序之中的所有操作都需要通过对象去完成举个例子在前端开发中的操作浏览器需要借助window对象操作网页需要使用document对象操作控制台需要借助console对象那么对象是什么呢可以说世间万物都是对象。像是一个人一只猫咪一颗子弹等等都可以抽象成程序中的对象。程序中所有的对象都被分为两个部分数据和功能以一个人为例他的身高、体重、姓名、年龄等属于数据人可以说话、走路、吃饭这些属于人的功能。数据在对象中被称为属性功能则被称为方法类class了解了对象之后我们还要知道在程序中如何创建对象。要想创建对象必须要先定义类所谓类class可以理解为对象的模型程序中可以使用类传递不同的参数创建特定的对象语法class 类名{ 属性名: 类型 ... constructor(参数1: 类型, 参数2: 类型...){ this.属性名 参数 ... } 方法名(){ /*...*/ } }举例定义一个Person类class Person{ name: string; age: number; constructor(name: string, age: number){ this.name name this.age age } walk(){ console.log(this.name 在走路) } } const person new Person(wmh, 18) //实例一个Person对象注可以直接将属性定义在构造函数中关于属性直接定义的属性是实例属性必须通过对象的实例访问person.name wyz使用static关键字修饰表明声明一个静态属性类属性类属性需要直接使用类来调用console.log(Person.静态属性名)使用readonly关键字修饰表明声明一个只读属性只能进行读操作使用public关键字修饰默认值表示可以在任意地方访问使用private关键字修饰私有属性只能在类内部进行访问使用protected关键字修饰只能在当前类和当前类的子类中访问继承与多态1. 继承对于继承这个概念用例子来说明假设在一个程序中需要用到Dog和Cat两个类从构成来看这两个类有许多部分可以共用单独定义的话就会造成代码的冗余此时我们就可以将这两个类的公共部分提取出来定义一个Animal类让Dog和Cat类继承Animal类所有的属性和方法特定的属性方法单独定义这就是继承。// Animal类 class Animal{ name: string; age: number; constructor(name: string, age: number){ this.name name; this.age age; } bark(){ console.log(动物在叫~~) } } // Dog类 class Dog extends Animal{ bark(){ console.log(${this.name}在汪汪叫); } } // Cat类 class Cat extends Animal{} const dog new Dog(旺财, 4); const cat new Cat(小金, 5) dog.bark();此时Dog和Cat类也成为子类、派生类Animal类被称为父类、超类如果在子类中添加了和父类同名的方法则子类会覆盖掉父类的方法这种形式我们称为方法重写在子类的方法中super就表示当前子类的父类如果在子类中写了构造函数则需要在子类的构造函数中调用super(参数)表明调用父类的构造函数2. 多态参考知乎: https://www.zhihu.com/question/30082151.花木兰替父从军摘自知乎抽象类与接口1. 抽象类以abstract修饰的类被称为抽象类与一般的类相比抽象类不能用来创建实例对象只能被其他的类继承抽象类中可以定义抽象方法抽象方法同样以abstract修饰不含方法体只能定义在抽象类中抽象类的子类必须重写抽象方法abstract class Person{ abstract sayHello(): void; //抽象方法 }2. 接口通俗的来说接口就是用来定义一个类的结构限制一个类中需要包含的属性和方法在定义类的时候使用implements关键字实现接口实例interface Person{ name: string; sayHello():void; } class Student implements Person{ constructor(public name: string) { } sayHello() { console.log(大家好我是this.name); } }3. 抽象类与接口的对比抽象类中的方法可以是抽象方法也可以不是接口中的属性方法都只能是抽象的不能有实际值它只是用来限制结构在同一作用域中抽象类不可以重名但接口可以他会合并重名接口中的属性方法一个类只能继承至一个抽象类但可以实现多个接口属性的封装由于常规的定义方式会使得类的属性暴露在外不建议这么做一般会采用对类的属性进行访问的限制private或protected修饰再配合类内部的getter和setter方法对属性进行访问实例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(孙悟空); console.log(p1.name); // 通过getter读取name属性 p1.name 猪八戒; // 通过setter修改name属性泛型定义一个函数或是一个类时有时候会出现无法确定类型的情况包括参数、属性、返回值的类型此时泛型便可以发挥作用举个例子function test(arg: any): any{ return arg; }上例中test函数的参数类型无法确定但可以确定参数和返回值类型相同由于类型不确定所以使用any类型但这样明显是不合适的首先any会关闭ts的类型检查其次这样也无法体现参数和返回值是相同类型这里我们就可以使用泛型function testT(arg: T): T{ return arg; }这里的T就是一个泛型T是这个泛型的名字自定义定义之后即可在函数或类中使用这个泛型泛型其实就表示某个类型对于上述的函数有两种使用方式方式一直接使用视作普通函数test(10)方式二指定类型在函数后制定泛型的类型teststring(wmh)另外可以同时指定多个泛型泛型间使用逗号隔开function testT, K(a: T, b: K): K{ const x a return b; } testnumber, string(10, hello);在类中也可以使用泛型class MyClassT{ prop: T; constructor(prop: T){ this.prop prop; } }