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实际上把整个语言升级到了严格模式。