class:
- 早期 JavaScript 中是没有类的,面向对象大多都是基于构造函数和原型实现的
- ES6 中开始增加了 “类” 相关的语法,使得 js中的面向对象实现方式更加标准
创建类
- 类中封装的并不是变量和函数,因此不能使用关键字
let
、const
或var
实例属性和实例方法:
// 创建类 class 类名 { 实例属性 实例方法 }
class Person {
name = '小明'
eat() {
console.log('在吃饭');
}
}
// 实例化一个对象
let p1 = new Person();
// 调用实例对象的属性
console.log(p1.name);
// 调用实例方法
p1.eat();
静态方法和静态属性:
语法:
class 类名 {
static 静态属性名 = 静态属性值;
static 静态方法名 () {
// 实例方法code
}
}
类中的实例属性和实例方法只能被创建的对象使用,不能被类直接调用
所以需要静态方法和静态属性,可以被类直接调用:
class Person {
name = '小明';
height = 185;
static age = 22;
eat() {
console.log('在吃饭');
};
static study() {
console.log('在学习');
};
}
let p1 = new Person();
// console.log(Person.height);
// Person.eat();
console.log(Person.age);
Person.study();
类中的构造函数:
constructor
是类中固定的方法名- 实例化时立即执行
- 接收实例化时传入的参数
- 不是类中必须要存在的方法
用于初始化值
class Person {
// 构造函数 接受实例化对象时传入的参数
constructor(name, age) {
this.name = name;
this.age = age;
}
// 实例方法
eat() {
console.log(`${this.name}在吃东西`);
}
}
// 实例化对象
let p1 = new Person('张三', 18);
let p2 = new Person('李四', 18);
// 对象调用实例方法 打印值不一样
p1.eat();
p2.eat();
类的继承:
- 类的继承子类可以使用父类的实例属性和实例方法
如果子类有构造函数,要先使用super()方法调用父类的构造函数,否则会报语法错误
继承语法:
class 子类名 extends 父类名 {
constructor (父类构造函数的参数...,子类构造函数的参数) {
// super方法调用父类的构造函数
super(父类构造函数的参数);
}
}
代码示例:
// 创建父类
class Person {
// 父类的构造函数
constructor(name, age) {
this.name = name;
this.age = age;
};
// 实例属性
eyes = 2;
arms = 2;
// 实例方法
eat() {
console.log(`${this.name}在吃饭`);
}
}
// 创建子类继承于父类
class Docter extends Person {
// 子类构造函数
constructor(name, age, addr) {
// 子类继承父类 要调用父类的构造函数 否则会报语法错误
super(name, age);
// 子类需要多传的参数
this.addr = addr;
};
// 子类的实例属性
zhiye = '医生';
}
// 创建子类的实例化对象
let d1 = new Docter('张三', 22, '山东');
console.log(d1.eyes);
console.log(d1.zhiye);
console.log(d1.addr);
d1.eat();