# 11-07
参考:
进度:🍅*10
- 属性标志和属性描述符 (opens new window)
- 属性的 getter 和 setter (opens new window)
- 原型继承 (opens new window)
- F.prototype (opens new window)
- 原生的原型 (opens new window)
- 原型方法,没有 proto 的对象 (opens new window)
- Class 基本语法 (opens new window)
- 类继承 (opens new window)
- 静态属性和静态方法 (opens new window)
- 私有的和受保护的属性和方法 (opens new window)
- 扩展内建类 (opens new window)
- 类检查:"instanceof" (opens new window)
- Mixin 模式 (opens new window)
- 错误处理,"try..catch" (opens new window)
- 自定义 Error,扩展 Error (opens new window)
# 原子笔记
__proto__是[[Prototype]]的 getter/setter,就像其他方法一样,它位于Object.prototype。箭头函数没有
super。重写一个 constructor:
- 对于派生类而言,在使用
this之前,我们必须在Child的 constructor 中将父 constructor 调用为super()。
- 对于派生类而言,在使用
类字段初始化:
- 对于基类(还未继承任何东西的那种),在构造函数调用前初始化。
- 对于派生类,在
super()后立刻初始化。
方法在内部的
[[HomeObject]]属性中记住了它们的类/对象。这就是super如何解析父方法的。因此,将一个带有super的方法从一个对象复制到另一个对象是不安全的。当
arr.filter()被调用时,它的内部使用的是arr.constructor来创建新的结果数组,而不是使用原生的Array对于一个扩展自内建类的类创建的对象,使用内建的方法例如
filter,map等,其内部使用的是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()); // false1
2
3
4
5
6
7
8
9
10可以给类添加一个特殊的静态 getter
Symbol.species,如果存在,则应返回 JavaScript 在内部用来在map和filter等方法中创建新实体的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 function1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18通常,当一个类扩展另一个类时,静态方法和非静态方法都会被继承。但内建类却是一个例外。它们相互间不继承静态方法。
可以通过提取对象内建的 toString 方法来判断数据类型,
{}.toString.call(something),如果其存在Symbol.toStringTag属性则返回此属性。