第9章 类和对象
1、类的定义
ES6中添加了对类的支持,引入了class关键字
ES6中提供的类实际上只是JS原型模式的包装。现在提供class支持后,对象的创建、继承更加直观。
class类中,可以包含 构造方法、实例方法、静态方法。
//类的定义
class A {
//ES6中的构造方法(类的属性,定义在构造方法中)
constructor(name) {
this.name = name;
this.age = 30;
}
//实例方法
say() {
console.log('我是A中的实例方法say,我的名字是 '+this.name);
}
//静态方法(静态方法与实例方法 同名互不影响)
static say(){
console.log("我是A中的静态方法say");
}
}
//直接调用静态方法
A.say();
//实例化类 调用实例方法
var a = new A('Tom');
a.say();
//类也有原型对象
console.log(A.prototype);
console.log(a.__proto__)
注意:
1.class类中不能直接定义属性,只能定义方法,方法之间不需要也不能使用逗号隔开
2.类只能先定义,再使用,没有提升效果。
3.静态方法只能通过类名直接调用,实例方法只能将实例化成对象后调用。
2、类的继承
注:父类有构造函数,子类构造函数中,需要调用super() 实现父类的构造函数,否则报错。
//类的继承
//父类A
class A {
//ES6中的构造方法
constructor(name) {
this.name = name;
this.age = 30;
}
//实例方法
say() {
console.log('我是A中的实例方法say,我的名字是 '+this.name);
}
//静态方法
static say(){
console.log("我是A中的静态方法say");
}
}
//子类B
class B extends A {
//构造方法
constructor(name) {
//使用函数形式的super(), 直接调用父类构造方法
//只要子类写了构造方法,就必须调用super(),且必须在使用this之前
super(name);
}
//实例方法
//子类方法 会覆盖父类同名方法
say() {
//子类方法中,可以使用super.方法() 调用父类的非构造方法
//当前方法是实例方法,则调用父类的实例方法
//当前方法是静态方法,则调用父类的静态方法
//super.say();
console.log('我是B中的实例方法say,我的名字是 '+this.name);
}
static coding() {
console.log('我是B中的静态方法coding');
}
}
//调用静态方法
B.say(); //A的静态方法
B.coding();//B自己的静态方法
//调用实例方法
var b = new B('Lucy');
b.say();//B中的实例方法say //如果B中没有,才调用A的实例方法say
b.coding();//报错,B和A中都没有实例方法coding (只有静态方法)