ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。
通过 class 关键字,可以定义类。基本上,ES6 的 class 可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的 class 写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。
**
知识点:
1) class 声明类
2) constructor 定义构造函数初始化
3) extends 继承父类
4) super 调用父级构造方法
5) static 定义静态方法和属性
6) 父类方法可以重写

es5的对象原型写法

基本用法

class内的方法必须使用简写。不能使用 ES5 的对象完整形式

  1. //手机--ES5写法,原型
  2. function Phone(brand, price){
  3. this.brand = brand;
  4. this.price = price;
  5. }
  6. //添加方法
  7. Phone.prototype.call = function(){
  8. console.log("我可以打电话!!");
  9. }
  10. //实例化对象
  11. let Huawei = new Phone('华为', 5999);
  12. Huawei.call();
  13. console.log(Huawei);
  14. //class--新写法
  15. class Shouji{
  16. //构造方法
  17. constructor(brand, price){
  18. this.brand = brand;
  19. this.price = price;
  20. }
  21. //方法必须使用该语法, 不能使用 ES5 的对象完整形式
  22. call(){
  23. console.log("我可以打电话!!");
  24. }
  25. }
  26. let onePlus = new Shouji("1+", 1999);

静态成员

构造函数也是对象,直接构造函数添加的属性就是静态成员,实例对象是没有办法访问到的,只能通过构造函数访问。
放到class中的话,就是static 静态成员,下面例子中的 noklia.name 为 undefined。而 Phone.name 就能访问到。

 // function Phone(){

  // }
  // Phone.name = '手机';
  // Phone.change = function(){
  //     console.log("我可以改变世界");
  // }
  // Phone.prototype.size = '5.5inch';

  // let nokia = new Phone();

  // console.log(nokia.name);
  // // nokia.change();
  // console.log(nokia.size);

  class Phone{
    //静态属性
    static name = '手机';
  static change(){
    console.log("我可以改变世界");
  }
  }

  let nokia = new Phone();
  console.log(nokia.name);
  console.log(Phone.name);

继承

使用 extends 继承父类的属性和方法、 super 调用父类的构造函数

 class Phone{
   //构造方法
   constructor(brand, price){
     this.brand = brand;
     this.price = price;
   }
   //父类的成员属性
   call(){
     console.log("我可以打电话!!");
   }
 }

class SmartPhone extends Phone {
  //构造方法
  constructor(brand, price, color, size){
    super(brand, price);// Phone.call(this, brand, price)
    this.color = color;
    this.size = size;
  }

  photo(){
    console.log("拍照");
  }

  playGame(){
    console.log("玩游戏");
  }

  call(){
    console.log('我可以进行视频通话');
  }
}

const xiaomi = new SmartPhone('小米',799,'黑色','4.7inch');
// console.log(xiaomi);
xiaomi.call();
xiaomi.photo();
xiaomi.playGame();

重写

在js中是要完全重写的,不能使用 super 调用父类的中的方法,而在typescript中是可以的。比如上面例子中的call方法,就是重写了。

get 和 set

set 必须传入参数
get 可用于动态计算后再返回值
set方法可用于校验传入的值是否合格再确定是否设置值

 // get 和 set  
class Phone{
  get price(){
    console.log("价格属性被读取了");
    return 'iloveyou';
  }

  set price(newVal){
    console.log('价格属性被修改了');
  }
}

//实例化对象
let s = new Phone();

// console.log(s.price);
s.price = 'free';