目录
面向对象
程序之中所有的操作都需要通过对象来完成。举例:操作浏览器需要使用window对象、操作网页需要使用document对象、操作控制台需要使用console对象。
类
使用class关键字定义一个类,其中对象中包括两个部分:属性、方法。
属性:分为实例属性和类(静态)属性。直接写的是实例属性,在属性前加上static关键字可以定义为类(静态)属性。实例属性可以直接访问,静态属性需要通过类去访问。
方法:分为实例方法和类(静态)方法。直接写的是实例方法,在方法前加上static关键字可以定义为类(静态)属性。实例方法可以直接访问,静态方法需要通过类去访问。
readonly关键字 表示方法或属性是只读的不能修改的。
class Person{
//定义实例属性
name : string = '小明';
//定义静态属性
static age :number = 18;
}
const p = new Person();
console.log(p.name);//小明
console.log(Person.age);//18
构造函数
constructor () { } 会在对象创建时调用;
在实例方法时,this表示当前的实例,创建的是哪个,this就是那个。可以通过this向对象中添加属性。
class Dog{
name:string;
age:number;
//构造函数
constructor(name:string,age:number){
this.name = name;
this.age = age;
}
sayWang(){
console.log('汪汪汪')
}
}
const dog1 = new Dog(name:'旺财',age:2);
const dog2 = new Dog(name:'来福',age:3);
继承
extends 使用继承后,子类将会拥有父类所有的方法和属性。
通过继承可以将多个类中共有的代码写在一个父类中,这样只需要写一次就可让所有的子类都同时拥有父类中的属性;
如果希望在子类中添加一些父类中没有的属性和方法时直接添加即可;
如果在子类中添加了和父类相同的方法,则子类方法会覆盖掉父类的方法;称为方法重写。
class Parent {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}
//使Son类继承Parent类
class Son extends Parent {
}
const s = new Son(name:'小明', age: 10);
console.log(s))
super关键字:在类的方中,super就表示当前类的父类。
如果在子类中写了构造函数,此时在子类的构造函数中必须对父类的构造函数进行调用。
抽象类
以abstract开头的类是抽象类。抽象类和其他类的区别就是不能创建实例对象。就是专门用来被继承的。
在抽象类中,可添加抽象方法,抽象方法必须使用abstract开头并且没有方法体,子类必须对抽象方法进行重写。
接口
接口用来定义一个类结构,用来定义一个类中应该包含哪些属性和方法;
接口可以当成类型声明去使用。接口只定义对象的结构,不考虑实际值;
在接口中所有方法都是抽象方法。
//定义接口
interface myInterface{
name:string;
age:number;
sayHello():void;
}
//实现接口
class MyClass implements myInterface{
name:string;
age:number;
constructor(name:string,age:number){
this.name = name;
this.age = age;
}
sayHello(){
console.log('你好你好')
}
}
实现接口:就是使类满足接口的要求。定义类的时候可以使类去实现一个接口。实现接口要用implement关键字。
属性的封装
现在属性是在对象中设置的,属性可以任意的被修改,会导致对象中的数据变得不安全。
TS可以在属性前添加属性修饰符public、private、protecte;
public:默认值。修饰的属性可以在任意位置直接访问或修改;
protected:受保护的属性。可以在当前类或当前类的子类中进行访问或修改;
private:私有属性。只能在类的内部进行访问或修改;(通过在类中添加方法可以使得私有属性被外部访问,getter:用来读取属性、setter:用来设置属性)
泛型
在定义函数或类时,如遇到类型不明确时可以使用泛型,泛型也可以同时指定多个。
function fn<T>(a:T):T{
return a;
}
//可直接调用具有泛型的函数
fn(a:10);//不指定泛型,可直接对类型进行推断
fn<string>(a:'hello');//指定泛型