06-创建类和实例
9.2.1 创建类和实例
在ES6之前,JavaScript中创建类的过程比较繁琐且不直观。ES6新引入了一些创建类的便捷语法:
class Car {
constructor() {
}
}
这段代码创建了一个名为 Car 的类。还没有创建它的任何实例(具体的车),不过现在已经能够创建实例了。使用关键字 new 可以创建一个具体的 car :
const car1 = new Car();
const car2 = new Car();
上述代码创建了两个 Car 。在将 Car 类复杂化之前,来看看 instanceof 运算符,这个运算符可以告诉大家一个给定的对象是否属于某个类。
car1 instanceof Car // true
car1 instanceof Array // false
从上面的代码中,可以看到 car1 是一个 Car 的实例,而非数组的实例。接下来把 Car 类变得更有趣一些。给它一些数据(品牌,型号),以及一些功能(换档)。
class Car {
constructor(make, model) {
this.make = make;
this.model = model;
this.userGears = ['P', 'N', 'R', 'D'];
this.userGear = this.userGears[0];
}
shift(gear) {
if(this.userGears.indexOf(gear) < 0)
throw new Error('Invalid gear: ${gear}');
this.userGear = gear;
}
}
这里面, this 关键字有它特殊的用途:它引用了方法被调用时所绑定的实例。可以认为它是一个占位符:当在写一个类的时候——抽象类, this 关键字就是某个具体实例的占位符。构造方法允许在创建实例的时候指定车辆的品牌和型号,还可以设置一些默认值:有效的档位( userGears ),以及当前档位( gear ),它的初始值为第一个有效的档位。(一般把它叫作用户档位,是因为如果这辆车有一个自动变速箱,当车辆在行驶的过程中,会有一个真实的机械齿轮,可能就会不一样了)。除了构造器—在创建对象时候调用,还创建了一个shift方法,该方法允许在有效档位中进行切换。下面看一个使用场景:
const car1 = new Car("Tesla", "Model S");
const car2 = new Car("Mazda", "3i");
car1.shift('D');
car2.shift('R');
上面这个例子,当调用 car1.shift('D') 时, this 跟 car1 绑定在一起。同理,在 car2.shift('R') 的调用中,this跟 car2 绑定在一起。可以验证 car1 处于前进档(D), car2 处于倒车档(R)。
> car1.userGear // "D"
> car2.userGear // "R"