TypeScript 是面向对象的 JavaScript。类描述了所创建的对象共同的属性和方法。
TypeScript 支持面向对象的所有特性,比如 类、抽象类、接口等。
一、类的基本使用
export default {}
// 类的基本使用
class Person {
// 字段(属性)
name: string
age: number
// 构造函数
constructor(name: string, age: number) {
this.name = name
this.age = age
}
// 函数(方法)
sayHello(): void {
console.log(`我的女神是${this.name},她今年${this.age},在我心里她永远十八岁`);
}
}
// 实例化类
let p = new Person("王祖贤",50)
p.sayHello()
二、类的继承
export default{}
class Person {
// 字段(属性)
name: string
age: number
// 构造函数
constructor(name: string, age: number) {
this.name = name
this.age = age
}
// 函数(方法)
sayHello(): void {
console.log(`我的女神是${this.name},她今年${this.age},在我心里她永远十八岁`);
}
}
class Student extends Person {
score:string;
constructor(name: string, age: number,score:string) {
// 调用父类中的构造函数
super(name, age)
this.score =score;
}
sayHello(): void {
// 调用父类中的方法
super.sayHello()
// 重写父类中的方法
console.log(`我是重写的方法,我叫${this.name},今年${this.age}岁,我的成绩是${this.score}`);
}
}
let s = new Student("赵丽颖",18,"A")
s.sayHello()
三、static与instanceof
export default {}
class StaticTest {
static salary: number
static say(): void {
console.log(`我们想要的工资是${StaticTest.salary}k`);
}
}
StaticTest.salary = 18
StaticTest.say()
class Person{}
let p = new Person()
let isPerson = p instanceof Person
console.log("p是Person实例化出来的吗",isPerson);
class Student extends Person{}
let s = new Student()
let isStudent = s instanceof Student
console.log("s是Person实例化出来的吗>",isStudent);
四、类的修饰符
1、public修饰符
当我们写一个类时,如果没有添加修饰符,那么类中成员就会有默认的修饰符public,表示公共的,在任何位置都可以访问该成员,在外部如a.name,在子类的内部(通过this.name)
class Person{
public name:string;
public age:number;
public constructor(name:string,age:number){
this.name=name;
this.age=age;
}
public say(){
console.log(`my name is ${this.name}`)
}
}
var a=new Student('小明',23)
2、private修饰符
使用private修饰的成员
外部无法访问这个成员
子类中也无法访问这个成员
class Person{
private name:string;
age:number;
constructor(name:string,age:number){
this.name=name;
this.age=age;
}
say(){
console.log(`my name is ${this.name}`)
}
}
class Student extends Person{
constructor(name:string,age:number){
super(name,age)
}
say(){
super.say();
console.log('呵呵',this.name)//在子类中使用private的属性将报错
}
}
var a=new Student('小明',23)
console.log(a.name)//在外部使用private的属性将报错
3、protected修饰符
使用protected修饰的成员
在外部无法访问这个成员
但是在子类中可以访问这个成员
使用readonly修饰的成员
在外部不能修改
在类的普通方法中,也不能修改
只有在类的构造函数中才能进行修改赋值
五、getter与setter
export default {}
class MyName {
private _fullName: string = "杨幂";
// 读取字段的值
set fullName(newName: string) {
console.log("set被调用了");
this._fullName = newName;
}
// 为字段赋值
get fullName() {
console.log("get被调用了");
return this._fullName;
}
}
let n = new MyName();
n.fullName = "刘亦菲" //赋值
console.log(n);
console.log(n.fullName); //取值
六、抽象
export default {}
abstract class Person {
abstract name: string;
abstract age: number;
abstract show():string;
showName():void{
console.log("Hello world!");
}
}
class Student extends Person {
name: string="王祖贤";
age: number=18;
show():string {
return "港风电影"
}
}
// let p = new Person();
let s = new Student();
let res = s.show()
console.log(res);
七、类的初始化顺序
export default{}
class Old{
name:string="李易峰";
constructor(){
console.log(`我是${this.name},我主演了古剑奇谭`);
}
}
class Young extends Old{
name:string="刘亦菲";
constructor(){
super();
console.log(`我是${this.name},我主演了天龙八部`);
}
}
let y = new Young();