ES6引入了Class(类)的概念,作为对象的模板。通过class关键字,可以定义类。class的出现,使得让对象原型的写法更加清晰、更像面向对象编程的语法。

属性方法

constructor方法

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

class Point {
}

// 等同于
class Point {
  constructor() {}
}

getter取值函数和setter存值函数

在类的内部可以使用get和set关键字,对某个属性设置取值函数和存值函数,拦截该属性的存取行为。

class Point {
  constructor() {}
  
  get prop() {
    return 'in getter';
  }
  
  set prop(value) {
    console.log('in setter:'+value);
  }
}

let point = new Point();
point.prop = 123; // in setter:123
point.prop; // 'in getter'

属性表达式

类的属性名,可以采用表达式。

let methodName = 'getArea';

class Square {
  constructor(length) {}
  
  [methodName]() {}
}

静态方法

类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。

class Point {
  static classMethod() {
    return 'hello';
  }
}

Point.classMethod(); // 'hello'

let point = new Point();
point.classMethod(); // TypeError: foo.classMethod is not a function

实例属性新写法

实例属性可以定义在类的最顶层。

class Point {
  name = 'yy';
	age = 18;
  
	constructor() {}

	print() {
    console.log(this.name + "'s age is " + this.age);
  }
}

示例

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

let p = new Point(1,2);
p.toString(); // (1,2)