es6 class写法以及继承
写法
通过使用class关键字,定义一个类;定义“类”的方法的时候,前面不需要加上function这个关键字,直接把函数定义放进去了就可以了。另外,方法之间不需要逗号分隔,加了会报错。
class内的方法必须通过new关键字之后才能调用,若直接调用则会报错。使用new关键字后,和es5构造函数相同;
class Father{
constructor(){
this.name = '小明'
}
children(){
return `姓名:${this.name}`
}
}
console.log(Father.children()) //报错
let p = new Father()
console.log(p.children()) //姓名:小明
//还可以写成这样
class Father{
constructor(){
this.name = '小明'
}
}
Father.prototype.children = function(){
return `姓名:${this.name}`
}
console.log(Father.children()) //报错
let p = new Father()
console.log(p.children()) //姓名:小明
当面试官询问不通过new关键字怎么调用class内方法时候,我们可以告诉他通过prototype也是可以调用的
class Father{
constructor(){
this.name = '小明'
}
children(){
return `姓名:${this.name}`
}
}
console.log('prototype',Father.prototype.children()) //prototype 姓名:undefined
class内也可以通过static来定义自己的静态方法和静态属性,则该方法/属性不会被实例继承,而是直接通过类来调用
class Father{
static age = 18;
constructor(){
this.name = '小明'
}
static children(){
return `姓名:三儿`
}
}
console.log(Father.children()) //姓名:三儿
console.log(Father.age) //姓名:18
let p = new Father()
console.log(p.age) //undefined
console.log(p.children()) //报错
继承
class在继承时使用extends关键字,子类必须在constructor方法中调用super方法,否则新建实例时会报错。这是因为子类没有自己的this对象,而是继承父类的this对象,然后对其进行加工。如果不调用super方法,子类就得不到this对象。
//没有调用super方法
class Father{
constructor(){
this.name = '小明'
this.age = 18
}
getname(){
return `姓名:${this.name}`
}
}
class Children extends Father{
constructor(){
//没有调用super方法
}
getage(){
return `年龄:${this.age}`
}
}
let p1 = new Children() //报错
//使用super方法
class Father{
constructor(){
this.name = '小明'
this.age = 18
}
getname(){
return `姓名:${this.name}`
}
}
class Children extends Father{
constructor(){
super()
}
getage(){
return `年龄:${this.age}`
}
}
let p1 = new Children()
console.log(p1.getname()) //姓名:小明
console.log(p1.getage()) //年龄:18