当前位置:嗨网首页>书籍在线阅读

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') 时, thiscar1 绑定在一起。同理,在 car2.shift('R') 的调用中,this跟 car2 绑定在一起。可以验证 car1 处于前进档(D), car2 处于倒车档(R)。

> car1.userGear      // "D"
> car2.userGear      // "R"