类的组成
类:构造函数、属性(实例属性、原型属性)、方法(实例方法、原型方法、访问器)、静态的属性和方法
所有实例上的属性都需要先声明再使用
class Circle {
x: number;
y: number;
constructor (x: number, y: number = 0, ...args: number[]) {
this.x = x
this.y = y
}
}
let circle = new Circle(100);
console.log(circle); // Circle { x: 100, y: 0 }
类的修饰符 public (公开的 我自己、我的儿子、外界) protected (受保护的 我自己、我的儿子) private(私有的 private)
class Animal {
// public name!: string;
// public age!: number;
// constructor(name: string, age: number) {
// this.name = name
// this.age = age
// }
// 直接在参数中添加 public private protected这些属性 这些属性会默认添加到实例
constructor(public name: string, public age: number) {
this.name = name
this.age = age
}
}
class Cat extends Animal {}
let cat = new Cat('Tom', 10)
当子类需要扩展
class Cat extends Animal {
public address; // 属性
constructor(name: string, age: number) {
super(name, age); // Animal.call(this,name,age);
this.address = "美国"; // 添加类中的属性
// this.name = "abc";
}
}
属性分为静态属性、实例属性、原型属性
- 实例属性:每个对象实例独立拥有的属性,保存在对象自身的属性中。
- 原型属性:保存在对象的原型链上的属性,被所有实例共享。在JavaScript中,每个对象都有一个内部属性
[[Prototype]]指向其原型对象。可以通过定义在原型对象上的属性,为对象的每个实例添加共享属性。
总结:实例属性是每个对象实例独立拥有的属性,而原型属性是被所有实例共享的属性。
如何设置原型属性?
// 类访问器,访问的是原型上的属性
class Animal1 {
private _name: string = "Tom";
get name() {
return this._name
}
set name(newVal) {
this._name = newVal
}
}
// 直接设置
Animal1.prototype.name = '1'
静态属性:只能通过类来访问的
class Animal1 {
static type = '哺乳类'
private _name: string = "Tom";
get name() {
return this._name
}
set name(newVal) {
this._name = newVal
}
}
console.log(Animal1.type) // 哺乳类
实例/原型方法
class Animal2 {
static getType() {
console.log("父");
return "哺乳类";
}
public eat: () => void; // 实例方法
constructor() {
this.eat = () => {};
}
say(): void {
console.log("父 say");
} // 不关心返回值 原型方法
}
class Mouse extends Animal2 {
static getType() {
// 调用父类
console.log("子");
super.getType();
return "哺乳类";
}
say() {
// 兼容父类,组合优先于继承
// 子类可以随便实现
console.log("子的say");
super.say();
return "abc";
}
}
console.log(Mouse.getType());
let mouse = new Mouse();
mouse.say();
总结
当我们在正常的类中定义属性和方法时,可以根据其所属的范围进行分类和使用。
- 原型属性和原型方法:通过在类的原型对象(
prototype)上定义属性和方法,来实现对所有实例对象的共享。在访问原型属性时,可以使用属性访问器(get)来定义属性的获取行为。 - 实例属性和实例方法:通过在类的构造函数中使用
this关键字,将属性附加到实例对象上。实例属性和实例方法只能通过实例对象来访问和调用。 - 静态属性和静态方法:定义在类本身而不是实例上的属性和方法。可以在类上直接访问静态属性和调用静态方法。
super关键字:在构造函数和静态方法中,super指向父类。在构造函数中,它可以调用父类的构造函数;在静态方法中,它可以调用父类的静态方法。而在原型方法中,super指向父类的原型。