# 11-07

参考:

进度:🍅*10

# 原子笔记

  • __proto__[[Prototype]] 的 getter/setter,就像其他方法一样,它位于 Object.prototype

  • 箭头函数没有 super

  • 重写一个 constructor:

    • 对于派生类而言,在使用 this 之前,我们必须在 Child 的 constructor 中将父 constructor 调用为 super()
  • 类字段初始化:

    • 对于基类(还未继承任何东西的那种),在构造函数调用前初始化。
    • 对于派生类,在 super() 后立刻初始化。
  • 方法在内部的 [[HomeObject]] 属性中记住了它们的类/对象。这就是 super 如何解析父方法的。因此,将一个带有 super 的方法从一个对象复制到另一个对象是不安全的。

  • arr.filter() 被调用时,它的内部使用的是 arr.constructor 来创建新的结果数组,而不是使用原生的 Array

  • 对于一个扩展自内建类的类创建的对象,使用内建的方法例如 filtermap 等,其内部使用的是 obj.constructor 来创建新的结果数组,而不是使用原生的内建类。

    class PowerArray extends Array {
      isEmpty() {
        return this.length === 0;
      }
    }
    
    let arr = new PowerArray(1, 2, 5, 10, 50);
    
    let filteredArr = arr.filter(item => item >= 10);
    alert(filteredArr.isEmpty()); // false
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
  • 可以给类添加一个特殊的静态 getter Symbol.species,如果存在,则应返回 JavaScript 在内部用来在 mapfilter 等方法中创建新实体的 constructor

    class PowerArray extends Array {
      isEmpty() {
        return this.length === 0;
      }
    
      // 内建方法将使用这个作为 constructor
      static get [Symbol.species]() {
        return Array;
      }
    }
    
    let arr = new PowerArray(1, 2, 5, 10, 50);
    
    // filter 使用 arr.constructor[Symbol.species] 作为 constructor 创建新数组
    let filteredArr = arr.filter(item => item >= 10);
    
    // filteredArr 不是 PowerArray,而是 Array
    alert(filteredArr.isEmpty()); // Error: filteredArr.isEmpty is not a function
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
  • 通常,当一个类扩展另一个类时,静态方法和非静态方法都会被继承。但内建类却是一个例外。它们相互间不继承静态方法

  • 可以通过提取对象内建的 toString 方法来判断数据类型,{}.toString.call(something),如果其存在Symbol.toStringTag 属性则返回此属性。

上次更新: 11/8/2020, 2:44:59 AM