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