ES6:类的基本知识
基本语法:
// 创建一个Person类
class Person {
// 构造器方法
constructor(name,age){
this.name = name
this.age = age
}
}
let p1 = new Person('jack',16)
let p2 = new Person('tom',18)
console.log('p1:',p1) // p1:,{"name":"jack","age":16}
console.log('p2:',p2) // p2:,{"name":"tom","age":18}
输出:
添加Person行为(方法):
// 创建一个Person类
class Person {
// 构造器方法
constructor(name,age){
this.name = name
this.age = age
}
// 定义一般方法
speak() {
console.log(`我是${this.name},我的年龄:${this.age}`)
}
}
let p1 = new Person('jack',16)
let p2 = new Person('tom',18)
console.log('p1:',p1.speak())
console.log('p2:',p2.speak())
以上代码的结论:
- speak方法实际定义在哪里了?--放在了类的原型上
- 通过person实例调用,speak里面的this就是person实例
继承
再定义一个student类
// 创建一个Person类
class Person {
// 构造器方法
constructor(name,age){
this.name = name
this.age = age
}
// 定义一般方法
speak() {
console.log(`我是${this.name},我的年龄:${this.age}`)
}
}
class Student extends Person {}
const student = new Student('cat',20)
console.log(student.speak()) // 我是cat,我的年龄:20
super是什么?
用于在子类Student的构造函数中调用,其作用是直接调用父级Person类中的构造函数,让其this上拥有name和age属性,代码:
// 创建一个Person类
class Person {
// 构造器方法
constructor(name,age){
this.name = name
this.age = age
}
// 定义一般方法
speak() {
console.log(`我是${this.name},我的年龄:${this.age}`)
}
}
class Student extends Person {
constructor(name,age,grade) {
// 必须写首行,执行父级构造器函数
super(name,age)
this.grade = grade
}
}
const student = new Student('cat',20,'初三')
console.log(student.speak()) // 我是cat,我的年龄:20
总结
- 类中的构造器不是必须要写的,要对实例进行初始化操作,如添加属性时才写构造器
- 如果 A类继承了B类,而且A类中写了构造器,那么A类构造器中的super是必须要调用的
- 类中定义的方法,都是放在了类的原型对象上,供实例去使用
- 类中定义的方法中,打印this,如果这个方法是通过实例对象调用,则this是这个实例对象,反之为undefined
- 注意:在类的语句{}中,只能定义方法和定义实例对象的属性(直接写赋值语句:如a=123),但是不能直接在类的语句中写声明变量如let a = 123,也不能直接打印console.log(),这一点和函数体语句最大的区别