13.Class


传统的Javascript是通过构造函数来定义一个对象;

//定义一个构造函数
function Point(x, y) {
    // body...
    this.x = x;
    this.y = y;
}
// 为构造函数添加一些方法
Point.prototype.toString = function() {
    // body...
    return '(' + this.x + ',' + this.y + ')';
};
var p = new Point(1, 2)
console.log(p); //Point { x: 1, y: 2 }
console.log("p is " + p); //p is (1,2)
console.log(typeof Point); //function
console.log(typeof p); //object

然后,采用Class的写法:

class Point {
    constructor(x, y) {
        this.x = x;
        this.y = y;
    }
    toString() {
        return '(' + this.x + ',' + this.y + ')';
    }
}

ES5的构造函数Point,对应ES6的Point类的构造方法constructor。

constructor方法

constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。

类的实例对象

生成类的实例对象的写法,与ES5完全一样,也是使用new命令。如果忘记加上new,像函数那样调用Class,将会报错。

不存在变量提升

Class不存在变量提升(hoist),这一点与ES5完全不同。

Class表达式

与函数一样,类也可以使用表达式的形式定义。

私有方法

私有方法是常见需求,但 ES6 不提供,只能通过变通方法模拟实现。

一种做法是在命名上加以区别。

this的指向

类的方法内部如果含有this,它默认指向类的实例。但是,必须非常小心,一旦单独使用该方法,很可能报错。

严格模式

类和模块的内部,默认就是严格模式,所以不需要使用use strict指定运行模式。只要你的代码写在类或模块之中,就只有严格模式可用。

考虑到未来所有的代码,其实都是运行在模块之中,所以ES6实际上把整个语言升级到了严格模式。

results matching ""

    No results matching ""