Class 的基本语法

简介

JavaScript 语言中,生成实例对象的传统方法是通过构造函数。ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。

// Class类代替构造函数
class Point {
    constructor(x, y) {
        this.x = x;
        this.y = y;
    }

    toString() {
        return '(' + this.x + ', ' + this.y + ')';
    }
}
var per = new Point(1, 2); // 实例对象
console.log(per); // Point {x: 1, y: 2}

基本上,ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。

上面代码定义了一个“类”,可以看到里面有一个constructor()方法,这就是构造方法,而this关键字则代表实例对象。这种新的 Class 写法,本质上与本章开头的 ES5 的构造函数Point是一致的。

Point类除了构造方法,还定义了一个toString()方法。注意,定义toString()方法的时候,前面不需要加上function这个关键字,直接把函数定义放进去了就可以了。另外,方法与方法之间不需要逗号分隔,加了会报错。

ES6 的类,完全可以看作构造函数的另一种写法。

class Point {
    // ...
}

console.log(typeof Point); // "function"
console.log(Point === Point.prototype.constructor); // true

上面代码表明,类的数据类型就是函数,类本身就指向构造函数。

使用的时候,也是直接对类使用new命令,跟构造函数的用法完全一致。

class Person {
    doStuff() {
        console.log('stuff');
    }
}

const per = new Person();
per.doStuff(); // "stuff"

构造函数的prototype属性,在 ES6 的“类”上面继续存在。事实上,类的所有方法都定义在类的prototype属性上面

class Point {
    constructor() {
        // ...
    }

    toString() {
        // ...
    }

    toValue() {
        // ...
    }
}

// 等同于
Point.prototype = {
    constructor() {},
    toString() {},
    toValue() {},
};

因此,在类的实例上面调用方法,其实就是调用原型上的方法。

class B {}
const b = new B();

b.constructor === B.prototype.constructor // true

上面代码中,bB类的实例,它的constructor()方法就是B类原型的constructor()方法。

 

上一篇:用prototype和直接扩展方法/属性的区别, 以及constructor构造器用法


下一篇:检测数据类型的四种方法