面向对象的特点 封装、继承、重写
封装:相当于把属性和方法放入一个容器中,将属性和方法存储储存起来,并可以调用。 继承:通过继承可以将其他类中的属性和方法(除了私有)引入到当前类中。通过继承可以在不修改类的情况下完成对类的扩展 重写:当使用继承时,子类有和父类相同名字的方法,子类会覆盖掉父类的方法。
TS中属性具有三种修饰符: public(默认值),可以在类、子类和对象中修改 protected ,可以在类、子类中修改 private ,可以在类中修改 只读属性(readonly): 如果在声明属性时添加一个readonly,则属性便成了只读属性无法修改。
对于一些不希望被任意修改的属性,可以将其设置为private,直接将其设置为private将导致无法再通过对象修改其中的属性。我们可以在类中定义一组读取、设置属性的方法,这种对属性读取或设置的属性被称为属性的存取器,读取属性的方法叫做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);
p1.name = '小白'
抽象类(abstract class) 抽象类是专门用来被其他类所继承的类,它只能被其他类所继承不能用来创建实例. 使用abstract开头的方法叫做抽象方法,抽象方法没有方法体只能定义在抽象类中,继承抽象类时抽象方法必须要实现
abstract class Person{
abstract nameChild(): void;
Modify(){
console.log('林立');
}
}
class A extends Person{
nameChild(){
console.log('林理');
}
}
接口(Interface) 接口的作用类似于抽象类,不同点在于接口中的所有方法和属性都是没有实值的,换句话说接口中的所有方法都是抽象方法。接口主要负责定义一个类的结构,接口可以去限制一个对象的接口,对象只有包含接口中定义的所有属性和方法时才能匹配接口。同时,可以让一个类去实现接口,实现接口时类中要保护接口中的所有属性。
泛型(Generic) 定义一个函数或类时,有些情况下无法确定其中要使用的具体类型(返回值、参数、属性的类型不能确定),此时泛型便能够发挥作用。 例子:
function test(arg: any): any{
return arg;
}
使用泛型:
function test<T>(arg: T): T{
return arg;
}
T是我们给这个类型起的名字(不一定非叫T),设置泛型后即可在函数中使用T来表示该类型。所以泛型其实很好理解,就表示某个类型。
可以同时指定多个泛型,泛型间使用逗号隔开:
function test<T, K>(a: T, b: K): K{
return b;
}
|