ES6中的class
基于原型继承创建类。
(1)class只是原型继承的语法糖
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return '('+this.x+', '+this.y+')';
}
}
相当于:
function Point(x,y){
this.x=x;
this.y=y;
}
Point.prototype={
toString:function(){
return '('+this.x+', '+this.y+')';
}
};
注:
class
定义中的实例方法,不需要function
关键字,
如果定义的是一个generator
方法,则在前面加*
,例如“* generatorFunc(...){...}
”
(2)class声明的类并不会提升。
var p = new Polygon(); // ReferenceError
class Polygon {}
(3)class也可以使用表达式的方式定义
const MyClass = class Me {
getClassName() {
return Me.name; //Me
}
};
let inst = new MyClass();
inst.getClassName(); // Me
Me.name // ReferenceError: Me is not defined
类的名字是MyClass
而不是Me
,Me
只在class
内部可用,指代当前类。
如果class
内部没有用到Me
,可以class
表达式可以省略Me
(4)继承
class ColorPoint extends Point {
constructor(x, y, color) {
super(x, y);
this.color = color;
}
toString() {
return this.color + ' ' + super.toString();
}
}
子类必须在constructor
方法中调用super
方法,否则新建实例时会报错
在子类的构造函数中,只有调用super
之后,才可以使用this
关键字,否则会报错
(5)原型关系
class A{}
class B extends A {}
为了让B继承A的类方法,
B.__proto__ === A
B.classMethod ===B.__proto__.classMethod===A.classMethod
为了让B的实例继承A的实例方法,
B.prototype.__proto__ === A.prototype
(new A).instanceMethod
===(new A).__proto__.instanceMethod
===A.prototype.instanceMethod
(new B).instanceMethod
===(new B).__proto__.instanceMethod
===B.prototype.instanceMethod
===B.prototype.__proto__.instanceMethod
===A.prototype.instanceMethod
(new B).instanceMethod===(new A).instanceMethod
注:
类方法,可以在class
定义的方法前加static
实现。
class A{
static classMethod(){}
}
类方法,也可以在super
对象上调用。