一、原型与原型链
- prototype:构造函数的 prototype 指向一个对象,这个对象是调用该 构造函数 创建出来的实例的 原型,每一个 JavaScript 对象(null 除外)在创建的时候就会与之”关联“另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型”继承“属性
- constructor:原型指向构造函数,原型与实例的 constructor 属性指向构造函数,实例的 constructor 关联自 原型。
- __ proto __:实例. __ proto __指向原型, __ proto __ 关联自 原型,可以理解成 Object.getProtoTypeOf(实例)
- 疑问:console.log(Function. __ proto __ === Function.prototype) // true?
- 原型链:实例a. __ proto __ 指向 原型对象A,原型对象A. __ proto __指向原型对象B,以此类推,直到指向 Object.prototype 指向的 null 停止查找,null 表示 ”没有对象“,即该处不应有值,而有这些原型组成的链就是原型链,当读取实例的属性时,如果找不到,就会沿着该实例的原型链进行逐层查找,知道查找到相应的属性值并返回,倘若没查到,则返回 undefined
**
二、词法作用域和动态作用域
- 作用域:指 程序源代码中 定义变量 的区域。作用域规定了 如何查找变量 ,即 确定当前执行代码对变量的访问权限。JavaScript 采用 词法作用域(lexical scoping),也就是 静态作用域
- 静态作用域:即 词法作用域 ,函数的作用域在 函数定义的时候就决定了,函数的 词法作用域 ,先从函数自身内部开始查找属性,没有则 根据其书写的位置,查找上一层代码。JavaScript 函数的执行用到了作用域链,函数作用域链 是在 函数定义的时候创建的。
- 动态作用域:(有空再写吧(||x_x))