类
直接定义的属性为实例属性 通过实例访问
通过static修饰的称为静态属性或者类属性 通过类访问
通过readonly修饰的称为只读属性 不能修改
static和readonly可以结合使用 定义一个静态只读属性
类中方法修饰和属性一样 区别不能使用readonly修饰
private 当成员被标记成 private时,它就不能在声明它的类的外部访问
protected
public 成员都默认为public
class Person {
name: string
age: number
readonly sex: string
static eyeNumber:number = 2
constructor(name: string,age: number, sex: string) {
this.name = name
this.age = age
this.sex = sex
}
}
继承
/* Dog extends Animal
此时Animal被称为父类 Dog为子类
使用继承后,子类将会拥有父类所有的属性及方法
通过继承可以将多个子类中共有的代码写在一个父类中
这样只需写一次即可让所有的子类都同时拥有父类中的属性和方法
可以在子类中直接添加父类中没有的属性或方法
如果在子类中添加了和父类中相同的方法,则子类方法会覆盖父类方法
这种子类覆盖掉父类的方法称为重写
父类称为基类或者超类 子类可以称为派生类
*/
class Animal {
name: String;
age: Number;
constructor(name: String, age: Number) {
this.name = name
this.age = age
}
sayHello() {
console.log(‘动物叫’);
}
}
class Dog extends Animal {
sayHello() {
console.log(‘汪汪汪’);
}
}
let dog = new Dog(‘旺财’, 3)
dog.sayHello()
class Cat extends Animal {
sayHello() {
console.log(‘喵喵喵’);
}
}
let cat = new Cat(‘咪咪’, 3)
cat.sayHello()
super关键字
// 在子类中使用构造函数 必须对父类的构造函数进行调用 因为constructor对父类中的constructor进行覆盖了
// 子类中可以使用super.xxx调用父类中的函数
class Animal {
name: String;
constructor(name: String) {
this.name = name
}
sayHello() {
console.log(‘动物叫’);
}
}
class Dog extends Animal {
age: Number
constructor(name: String, age: Number) {
super(name)
this.age = age
}
}
const dog1 = new Dog(‘旺财’, 2)
抽象类
抽象类
/*
抽象类做为其它派生类的基类使用。 它们一般不会直接被实例化。
以abstract开头的类为抽象类
抽象类和其他类区别不大, 只是不能用来创建对象
抽象类就是专门用来被继承的类
抽象类中可以添加抽象方法
*/
abstract class Animal {
name: String;
constructor(name: String) {
this.name = name
}
/*
定义一个抽象方法
抽象方法使用abstract开头,没有方法体
抽象方法只能定义在抽象类中,子类必须对抽象方法进行重写
*/
abstract sayHello(): void
}
class Dog extends Animal {
age: Number
constructor(name: String, age: Number) {
super(name)
this.age = age
}
sayHello() {
console.log(‘wangwangwang’);
}
}
属性封装
/*
* public 公共的 默认值 修饰的属性可以在任意位置访问(修改)
* private 私有属性 只能在类内部进行访问(修改) 通过在类中添加方法使得私有属性被外部访问 子类中不能访问
* protected 受保护的 只能在当前类和当前类的子类访问
*/
class Person {
private _name: string
protected _age: number
constructor(name: string, age: number) {
this._name = name
this._age = age
}
get name() {
return this._name
}
set name(value: string) {
this._name = value
}
get age() {
return this._age
}
set age(value: number) {
if (value >= 0) {
this._age = value
}
}
}
const person = new Person(‘张三’, 12)
console.log(person.name)
console.log(person.age)
person.name = ‘李四’
person.age = 22
console.log(person);
简写
// 可以直接将属性定义在构造函数中
class C {
constructor(public name: string, private age: number) {
this.name = name
this.age = age
}
}