ES6新增了类。
类的创建方式有:类声明、类表达式、具名类表达式。
//类声明 class PersonClass {
//类表达式 let PersonClass = class{
//具名类表达式 let PersonClass = class PersonClass2{
class PersonClass{
//构造器
constructor(name){
this.name = name;
}
//方法
sayName(){
console.log(this.name);
}
}
let person = new PersonClass("张三");
person.sayName();
类可以作为参数传入函数。
function createObject(classDef) {
return new classDef();
}
let obj = createObject(class {
sayHi() {
console.log("Hi!");
}
});
obj.sayHi(); // "Hi!"
类表达式的另一个用途是立即调用类构造器,以创建单例。
let person = new class {
constructor(name) {
this.name = name;
}
sayName() {
console.log(this.name);
}
}("Hi");
person.sayName(); // "Hi"
访问器属性
class PersonClass {
constructor(name) {
this._name = name;
}
get name(){
return this._name;
}
set name(value){
this._name = value;
}
};
let person = new PersonClass("张三"); //"张三"
console.log(person.name);
person.name = "李四";
console.log(person.name); //"李四"
静态成员
ES5及更早版本中是在构造器上添加额外方法来模拟静态成员。
function PersonType(name) {
this.name = name;
}
// 静态方法
PersonType.create = function(name) {
return new PersonType(name);
};
// 实例方法
PersonType.prototype.sayName = function() {
console.log(this.name);
};
var person = PersonType.create("张三");
ES6静态成员则是在方法与访问器属性的名称前添加static关键字。
class PersonClass {
// 等价于 PersonType 构造器
constructor(name) {
this.name = name;
}
// 等价于 PersonType.prototype.sayName
sayName() {
console.log(this.name);
}
// 等价于 PersonType.create
static create(name) {
return new PersonClass(name);
}
}
let person = PersonClass.create("张三");
使用派生类进行继承
使用extends关键字指定当前类所需要继承的函数,调用super()方法访问基类的构造器。
class Rectangle {
constructor(length, width) {
this.length = length;
this.width = width;
}
getArea() {
return this.length * this.width;
}
static create(length, width) {
return new Rectangle(length, width);
}
}
class Square extends Rectangle {
constructor(length) {
super(length, length);
}
}
var square = new Square(3);
console.log(square.getArea()); // 9
console.log(square instanceof Square); // true
console.log(square instanceof Rectangle); // true
//继承静态成员
var rect = Square.create(3, 4);
console.log(rect.getArea()); // 12
继承了其他类的类被称为派生类。如果派生类指定了构造器,就需要使用 super() ,否则会造成错误。
若不使用构造器, super()方法会被自动调用,并会使用创建新实例时提供的所有参数。
使用 super()的注意点:
(1)只能在派生类中使用 super() 。
(2)在构造器中,必须在访问 this 之前调用 super() 。
(3)唯一能避免调用 super() 的办法,是从类构造器中返回一个对象。
(4)可以在派生类方法中使用super.xx()调用基类方法xx。
派生类中的方法会屏蔽基类的同名方法。