面向对象编程是一个很流行也很让人容易理解的方法。面向对象编程中的一个核心概念就是类,我们可以把事物都抽象成一个个的类来描述他们的信息和行为。
我们把JavaScript称为基于对象的语言,而不是面向对象的语言,它是一个基于prototype的语言。它的语法中没有像Java之类典型面向对象语言中定义一个类的语法,我们要创建一个对新的对象的描述,可能会这样写:
function Person(name, age) {
this.name = name;
this.age = age;
this.walk = function () {
console.log("I'm walking...");
};
}
然后要根据这个对象描述创建一个新对象实例,就会这么做:
var person = new Person('kevin', 18);
在ES6中,提供了一个更符合面向对象风格的类定义方式:使用class关键字,虽然它只是一个语法糖,但是好歹看起来和主流面向编程的语言更一致了。
上面的例子可以用class
关键字改写:
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
walk() {
console.log("I'm walking...");
}
}
静态方法
提供了static
关键字在类中定义静态方法:
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
walk() {
console.log("I'm walking...");
}
static create(name, age) {
return new Person(name, age)
}
}
继承
可以使用extends
关键字让当前类继承另一个类的属性和方法:
// 父类:形状
class Shape {
constructor(name) {
this.name = name;
}
draw() {
console.log("drawing " + this.name);
}
}
//子类:圆形
class Circle extends Shape {
constructor() {
super('circle'); //调用父类的constructor
}
}
//子类:方形
class Rect extends Shape {
constructor() {
super('rect'); //调用父类的constructor
}
}
var circle = new Circle();
circle.draw(); //drawing circle
var rect = new Rect();
rect.draw(); //drawing rect