1. 作用域链
管理变量访问的机制,决定代码中变量的查找范围
核心特点
- 层级结构:由当前作用域,所以父级作用域组成,形成链式结构;
- 查找规则: ‘从内到外’,先在当前作用域查找,找不到逐级向上查找,直到全局作用域;
- 静态确定: 在函数定义的时候就已经确定了,与调用位置无关
2. 原型链
对象属性和方法的查找规则
核心特点
- 继承机制:允许对象访问其原型对象的属性和方法;
- 查找规则: ‘从自身到原型’,先在对象自身查找,找不到沿着原型链向上查找,直到Object.proptotype;
- 动态性:可以在运行时修改对象的原型;
3. 主要区别
| 特性 | 作用域链 | 原型链 |
|---|
| 作用对象 | 函数作用域中的变量 | 对象的属性和方法 |
| 查找方向 | 从内到外 | 从下到上 |
| 顶层对象 | 全局对象 | Object.prototype |
| 确定时机 | 函数定义时静态确定 | 对象创建时确定,但可以动态修改 |
| 主要用途 | 变量访问控制 | 属性和方法继承 |
4. 构造函数,原型(对象),对象原型的关系
1. 函数,会有一个 ‘prototype’属性,这个属性指向的就是原型(对象);
2. 对象有一个属性‘proto’指向构造函数的原型(对象)(proptotype)
3. 原型(对象)里有个属性‘constructor’指向构造函数
5. 关键字: instanceof
判断的是:是不是在这条原型链上
let a = {}
a instanceof Object //true
a instanceof Array //false
[] instanceof Array //true