# 面向对象

只是语法糖,内部还是使用 Prototype 实现

# class

class Emp {
  // 构造函数
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
  // 普通方法
  signIn() {
    console.log(this.name + "打卡上班");
  }
  // 属性的 getter setter,实际调用属性不是方法
  get info() {
    return this.name + " " + this.age;
  }

  set info(info) {
    let [name, age] = info.split(" ");
    this.name = name;
    this.age = age;
  }
}
var emp = new Emp("conan", 11);

console.log(emp); // Emp {name: "conan", age: 11}
emp.signIn(); // conan打卡上班
console.log(emp.info); // conan 11
emp.info = "lan 18";
console.log(emp.info); // lan 18

# extends

class Emp {
  // 构造函数
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
  // 普通方法
  signIn() {
    console.log(this.name + "打卡上班");
  }
  // 属性的 getter setter,实际调用属性不是方法
  get info() {
    return this.name + " " + this.age;
  }

  set info(info) {
    let [name, age] = info.split(" ");
    this.name = name;
    this.age = age;
  }
}

// 只能单继承
class Manager extends Emp {
  constructor(name, age, dept) {
    super(name, age);
    this.dept = dept;
  }

  signIn() {
    super.signIn();
    console.log("经理主持会议");
  }
}

// var manager = new Manager("kid", 20);// 不建议在子类没有构造函数时这样调用,应给子类添加构造函数
var manager = new Manager("kid", 20, "技术部"); // 不建议在子类没有构造函数时这样调用,应给子类添加构造函数
console.log(manager); // Manager {name: "kid", age: 20, dept: "技术部"}
manager.signIn();
// kid打卡上班
// 经理主持会议

# 成员变量 ⚠️

还没发布,只有部分浏览器支持,或使用babel转换

class Employee {
  company = "qq";
  constructor(name) {
    this.name = "hello" + name;
  }
}
var emp = new Employee("conan");
console.log(emp.company); // qq
console.log(new Employee("haha").company); // qq

# 静态成员 ⚠️

还没发布,只有部分浏览器支持,或使用babel转换

只能通过类来调用

class Ticket {
  static count = 0;
  constructor(name) {
    this.name = name + "卖票了";
  }
}
var t1 = new Ticket("conan");
Ticket.count++;
console.log(Ticket.count);

# 私有成员 ⚠️