Class 基本用法
- 格式
// 1.声明形式
class Person {
constructor() {}
speak() {}
}
// 2.表达式形式
const Person = class {
constructor() {
console.log('constructor');
}
speak() {}
};
new Person();
- 类名首字母一般大写
- 实例化时执行构造方法,所以必须有构造方法contructor,但可以不写出来
- this 代表实例对象,上面定义的是实例属性/方法
- 一般在构造方法中定义属性,方法不在构造方法中定义
Class的属性和方法
- 实例属性 方法就是值为函数的特殊属性。
class Person {
// 属性是添加到实例对象上的
age = 0;
sex = 'male';
// 添加到类的原型对象上
getSex = function() {
return this.sex;
};
constructor(name, sex) {
// 添加到实例对象上
this.name = name;
this.sex = sex;
}
}
const p = new Person('Alex', 'male');
- 静态方法 添加到类本身上
- 使用static关键字
class Person {
static getSex = function() {
return this.sex;
};
constructor(name) {
this.name = name;
}
}
const p = new Person('Alex');
- 直接在类上添加
class Person {
constructor(name) {
this.name = name;
}
}
Person.getSex = function() {
return this.sex;
}
const p = new Person('Alex');
- 静态属性 与静态方法使用方式一致
- 私有属性和方法 : 一般情况下,类的属性和方法都是公开的 ,公有的属性和方法可以被外界修改,造成意想不到的错误
- _ 开头表示私有
- 将私有属性和方法移出类
Class的继承
- 使用exends关键字实现继承,同名属性子类覆盖父类
class Person {
constructor(name, sex) {
this.name = name;
this.sex = sex;
this.say = function () {
console.log('say');
};
}
speak() {
console.log('speak');
}
static speak() {
console.log('static speak');
}
}
Person.version = '1.0';
class Programmer extends Person {
constructor(name, sex) {
super(name, sex);
}
}
- super关键字
-
super前方不可以有this操作
作为函数调用
1)代表父类的构造方法,只能用在子类的构造方法中,用在其他地方就会报错
2)super 虽然代表了父类的构造方法,但是内部的 this 指向子类的实例作为对象使用
1)在构造方法中使用或一般方法中使用 super 代表父类的原型对象 Person.prototype
// 定义在父类实例上的方法或属性,是无法通过 super 调用的
// 通过 super 调用父类的方法时,方法内部的 this 指向当前的子类实例
class Person {
constructor(name) {
this.name = name;
console.log(this);
}
speak() {
console.log('speak');
}
static speak() {
console.log('Person speak');
console.log(this);
}
}
class Programmer extends Person {
constructor(name, sex) {
super(name, sex);
}
speak() {
super.speak();
console.log('Programmer speak');
}
}
2)在静态方法中使用, 指向父类,而不是父类的原型对象
// 指向父类,而不是父类的原型对象
// 通过 super 调用父类的方法时,方法内部的 this 指向当前的子类,而不是子类的实例
class Person {
constructor(name) {
this.name = name;
console.log(this);
}
speak() {
console.log('speak');
}
static speak() {
console.log('Person speak');
console.log(this);
}
}
class Programmer extends Person {
constructor(name, sex) {
super(name, sex);
}
static speak() {
super.speak();
console.log('Programmer speak');
}
}
- 注意事项 : 使用 super 的时候,必须显式指定是作为函数还是作为对象使用,否则会报错