基于class关键字创建类

2018-03-03大约3分钟

ES6新增加了class关键字,自此,再也不用听"原型"、"prototype"、"原型链"之类折磨人的词了,简单、轻松学会创建类,而不用纠结复杂深奥的语法,何乐而不为?

本章介绍的内容,IE浏览器不支持,若代码运行出错或无响应,请尝试换用先进的浏览器。

构造函数

class关键字来创建一个类的时候,可以用constructor这个特殊的方法来创建和初始化一个用这个类创建的对象。

class Dog {
    constructor(type, color) {  // 定义构造函数,构造函数名始终是constructor
        this.type = type;
        this.color = color;
    }

    getInfo() {     // 定义类的方法,可以用this访问类的其它属性
        return `${this.color}${this.type}狗`;
    };
}

const dog = new Dog("牧羊犬", "白色");
console.log(dog.getInfo());

相比通过function来定义类,是不是简洁明了许多?

继承

继承一个父类的时候,用extends关键字就可以,也可以使用super关键字来访问父类的属性和方法:

/*
定义Dog作为父类
*/
class Dog {
    constructor(type, color) {
        this.type = type;
        this.color = color;
    }

    getInfo() {
        return `${this.color}${this.type}狗`;
    }
}

/*
定义子类
*/
// 使用extends关键字继承Dog类
class ShepherdDog extends Dog { 
    constructor(color, weight) {
        // 调用父类的构造函数。super()函数是父类的构造函数,根据父类的构造函数的参数情况来决定如何传递参数
        super("牧羊犬", color);  
        this.weight = weight;
    }

    getInfo() {
        return `${super.getInfo()},${this.weight}公斤`;
    }
}

/*
使用子类
*/
const dog = new ShepherdDog("白色", 10);
console.log(dog.getInfo());

需要注意的是,继承一个类的时候,子类的constructor构造函数里面一定要调用父类的构造函数super,并且一定要在任何使用this的语句之前和return语句之前使用,否则运行时就会出错。