class和继承

class基本使用

  1. class Student{
  2. constructor(name, number) {
  3. this.name = name
  4. this.number = number
  5. }
  6. sayHi () {
  7. console.log(`姓名:${this.name} 学号:${this.number}`);
  8. }
  9. }
  10. const zs = new Student('zs', 100)
  11. console.log(zs.name);
  12. console.log(zs.number);
  13. zs.sayHi()

继承基本使用

  1. // 父类
  2. class People{
  3. constructor(name) {
  4. this.name = name
  5. }
  6. eat () {
  7. console.log(`${this.name} eat something`);
  8. }
  9. }
  10. // 子类
  11. class Student extends People{
  12. constructor(name, number) {
  13. super(name)
  14. this.number = number
  15. }
  16. sayHi () {
  17. console.log(`姓名:${this.name} 学号:${this.number}`);
  18. }
  19. }
  20. class Teacher extends People{
  21. constructor(name, major) {
  22. super(name)
  23. this.major = major
  24. }
  25. teach () {
  26. console.log(`${this.name} 教授 ${this.major}`);
  27. }
  28. }
  29. const zs = new Student('zs', 100)
  30. console.log(zs.name);
  31. console.log(zs.number);
  32. zs.sayHi()
  33. zs.eat()
  34. const wang = new Teacher('王', '语文')
  35. console.log(wang.name);
  36. console.log(wang.major);
  37. wang.teach()
  38. wang.eat()

JS原型

instanceof类型判断

  1. A instanceof B === true
    1. A是B构造出来的一个实例
    2. 如果C是B的父类,A instanceof C===true也成立
    3. Object是所有类的父类
  2. class的本质是function,它是语法糖

    隐式原型和显式原型

  3. 隐式原型:proto

显式原型:prototype

  1. 每个class都有显式原型prototype

每个实例都有隐式原型proto
实例的__proto指向对应class的prototype

  1. 获取属性或执行方法时,先在自身属性和方法寻找,如果找不到则去proto中查找

    原型链

  2. People.prototype === Student.prototype.protoimage.png

  3. class是ES6语法规范,由ECMA委员会发布。

ECMA只规定语法规则,即我们代码的书写规范,不规定如何实现。
以上实现方式都是V8引擎的实现方式,也是主流的。

相关面试题

  1. 如何准确判断一个变量是不是数组?
    1. a instanceof Array
  2. 手写一个建议的jQuery,考虑插件和扩展性
  3. class的原型本质如何理解?
    1. 原型和原型链
    2. 属性和方法的执行规则