1 基本结构
// ES6使用 class 来声明一个类
class Person {
// 类中必须要有构造函数,即使不写,js引擎会自动创建一个空的constructor。
// 构造函数的作用:主要是为实例化空对象添加属性
// 构造函数在类的实例化时,会自动运行。因此可以将实例化后需要自动运行的方法放在构造函数内。
constructor(name,sex){
this.name = name;
this.sex = sex;
this.say();
}
// 普通的方法
say(){
console.log( "我是"+ this.name );
}
// ES6新增 静态方法(静态函数)
static play(){
console.log("我是静态方法");
}
}
// 实例化
let p1 = new Person("张三","男");
let p2 = new Person("rose","女");
// 所有实例对象共享原型对象
console.log( p1.__proto__ == p2.__proto__ );
console.log( p1 );
// 静态方法只能使用 类名.静态方法() 调用
Person.play()
2 类中的静态方法
正常情况下所有类中定义的方法,都会被实例继承。但如果一个方法前加上static关键字,就表示该方法不会被实例继承。也不能被实例调用,而是直接通过类来调用,这个被称为“静态方法”。
// 静态方法只能使用 类名.静态方法() 调用
Person.play()
3 实现继承
ES6 子类中使用 extends 即可实现继承
// 定义子类,继承Person父类
// ES6 使用 extends 关键词实现继承,比ES5的修改原型对象实现继承,要清晰和方便。
class Girl extends Person{
}
// 即使子类是个空壳,目前也可以使用父类的静态方法
Girl.play()
子类的基本构造:
// 定义子类,继承Person父类
// ES6 使用 extends 关键词实现继承,比ES5的修改原型对象实现继承,要清晰和方便。
class Girl extends Person{
constructor(){
// 子类的构造函数中第一行需先调用 super(),用于实现继承
super();
}
go(){
}
say(){
}
}
如果想在子类中添加自己的属性:
1) 直接在子类的构造函数中添加
constructor(name,sex,age){
// 子类的构造函数中第一行需先调用 super(),用于实现继承
super();
this.name = name;
this.sex = sex;
this.age = age;
}
2)在super()添加父类的属性名,实现对父类的代码的“借用”
constructor(name,sex,age){
// 子类的构造函数中第一行需先调用 super(),用于实现继承
super(name,sex);
this.age = age;
}
3)假如子类和父类有重名的方法,可以使用super 关键词实现子类对父类方法的调用。
class Girl extends Person{
constructor(name,sex,age){
// 子类的构造函数中第一行需先调用 super(),用于实现继承
super(name,sex);
this.age = age;
}
go(){
super.say();//调用父类的say方法
}
// say(){
// console.log("我是子类的say方法");
// }
}
实际上,super有两种使用方式:
1) 在子类的构造函数的第一行,作为函数使用,用于实现子类对父类的属性代码“借用”
2) 作为对象使用,实现子类对父类的重名的方法的调用