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