Class基本语法:
class People { // 类名后面无需小括号
constructor(a, b) { //类的构造方法constructor,必须得有,否则会被默认添加,new时自动被调用
this.name = a;
this.age = b;
} // 此处无需逗号
sayName() { // 无function关键字
console.log(this.name);
}
}
var p1 = new People("yuan", 18);
var p2 = new People("qin", 20);
console.log(p1, p2);
console.log(p1.sayName == p2.sayName); // true ,和原型创建方式一样,类的方法都定义在类的原型上
p1.sayName();
Class属性相关知识:
class People {
// 顶层属性:所有实例的属性值一样时可以写在顶层属性里面,这样既节约内存也可以不用多次传参
school = "武汉大学";
_grade = 0;
constructor(a, b) {
this.name = a;
this.age = b;
}
sayName() {
console.log(this.name);
}
// 属性的set存值函数和get取值函数:
set grade(value) {
this._grade = value;
console.log(this._grade);
}
get grade() {
return this._grade + 1;
}
}
var p1 = new People("yuan", 18);
p1.grade = 8; // 给grade属性赋值时,调用set方法(并传递属性值)
console.log(p1.grade); // 获取grade属性值时,调用get方法(返回值是该属性值)
Class的静态方法和静态属性:
class People {
static name="静态name";
constructor(a, b) {
this.name = a;
this.age = b;
}
static sayName() {
console.log(this.name); // 此处的this指的是类
}
sayName() {
console.log(this.name); // 此处的this指的实例对象
}
}
var p1 = new People("yuan", 18);
console.log(p1.name); // yuan
p1.sayName(); // yuan
// 静态属性和方法由类自己调用,实例不会继承(父类的静态方法和静态属性,可以被子类继承)
console.log(People.name); // 静态name
People.sayName(); // 静态name
Class的继承:
// 父类People
class People {
static name = "静态name";
static sayName() {
console.log("子类可以继承父类的方法");
}
constructor(a, b) {
this.name = a;
this.age = b;
}
sayName() {
console.log(this.name);
}
}
// 子类Student继承父类People的属性和方法
class Student extends People {
constructor(a, b, c) {
super(a, b); // 表示父类的构造函数,去构造name和age对象,注意super方法的调用要在this之前
this.grade = c;
}
say(){
super.sayName(); // 如果想在这里就使用父类的方法,可以通过super对象进行调用,这里的super可以看作是父类的实例
}
static stuName=super.name; // 静态属性中的super对象可以看作父类自己
static say(){
super.sayName(); // 静态方法中的super对象可以看作父类自己
}
}
var p1 = new Student("yuan", 18, 7); // 子类的实例,可以继承父类的属性和方法
console.log(p1.name);
console.log(p1.age);
console.log(p1.grade);
p1.sayName();
console.log(People.name,Student.name); // "静态name" 子类会继承父类的静态属性
Student.sayName(); // "子类可以继承父类的方法" 子类会继承父类的静态方法
p1.say(); // yuan
Student.say(); // "子类可以继承父类的方法"