es5里面有面向对象,为啥es6里面还要出一个新的面向对象,因为es5里面的面向对象没有统一的写发,而es6为统一写法提供了函数处理。
class 类的生命
constructor() 构造函数的申明 构造函数初始化的属性承载器
extends 关键字实现继承 (父类和超类)
super() 继承方法 相当于A.prototype.constructor.call(this)
1 通过 extends关键词实现继承 ,这边es5通过写u给原型链的实现的继承方便清晰的多
class Anima{ //父类
constructor(name){
this.name = name
}
say(){
let a = 2
console.log('my name is',this.name)
}
}
class Cat extends Anima{
constructor(name,age){ //构造函数
super(name); //继承关键词 --- 类似 call 改变this指向
this.age =age;
}
eat(){
console.log(`i like fish...`,this.age )
}
}
var b = new Anima('我是x','我是y');
b.say(); //结果 我是x
b.eat(); //结果 我是y
。。。注意在子类的constructor方法中,只有调用super之后,才可以使用this关键字,否则会报错。
class Cat extends Anima{
constructor(name,age){ //构造函数
this.name=name //这样会报错 error
super(name); //继承关键词 --- 类似 call 改变this指向
this.age =age;
}
eat(){
console.log(`i like fish...`,this.age )
}
}
super这个关键字,既可以当作函数使用,也可以当作对象使用。在这两种情况下,它的用法完全不同。
第一种情况,super作为函数调用时,代表父类的构造函数。ES6 要求,子类的构造函数必须执行一次super函数。
class A {}
class B extends A {
constructor() {
super();
}
}
第二种情况,super作为对象时,在普通方法中,指向父类的原型对象;在静态方法中,指向父类
class A {
p() {
return 2;
}
}
class B extends A {
constructor() {
super();
console.log(super.p()); // 2
}
}
let b = new B();