浅谈原型、执行上下文和作用域

原型

构造函数

一个普通函数,内部使用了this变量

实例

对构造函数使用new运算符,就能生成实例对象,并且this会绑定在实例上

原型链

一个实例对象,自身不存在的属性可以通过它的隐式原型proto向指向的原型对象找,若没有,则同理顺着该原型对象的proto到该原型对象的原型对象上找

原型(原型对象)

原型对象是每个函数的prototype属性指向的一个对象,可以理解为一个仓库,可以在上面定义其他属性,它自带一个constructor,指向回它的构造函数

  • 每创建一个函数,该函数就会自带一个prototype属性(显式原型),该属性是一个指针,指向该函数的原型对象。
  • 若这个函数是构造函数,则由它构建的实例会自带一个proto属性(隐式原型),该属性是一个指针,指向原型对象
  • 原型对象上有一个属性constructor,该属性也是一个指针,指向其关联的构造函数
  • 如果Person的原型Person.prototype对象变成了某一个类的实例Person{},这个实例又会指向一个新的原型对象Object.prototype


执行上下文

针对对象或者函数,可以理解为this的值

  • 分类:
    • 全局上下文:window为全局上下文
    • 函数(局部)上下文
  • 特点:
    • 动态的,函数调用的时候时创建,函数调用结束时释放

作用域

一块地盘,一个代码段所在的区域。

  • 分类:
    • 全局作用域
    • 函数作用域
    • 块级作用域
  • 作用:隔离变量,不同作用域下同名的变量名不会产生冲突
  • 特点:
    • 静态的,只要定义好了就一直存在,不会改变

作用域链

由多个具有从属关系的作用域形成的链,查找变量时沿着作用域链查找

  • 自由变量:当前作用域没有定义的变量,可以顺着作用域链到父级作用域中去找