原型链是对象属性查找路径,按a.b→a.__proto__.b→逐级向上至object.prototype终止;作用域链是变量查找路径,按当前函数→外层函数→全局作用域静态查找。

原型链是对象属性查找的路径
当你写 a.b,JavaScript 引擎会先检查对象 a 自身是否有属性 b;没有就沿着 a.__proto__ 向上找,依次访问 a.__proto__.b、a.__proto__.__proto__.b,直到找到或抵达 Object.prototype(其 __proto__ 为 null)为止。这个逐级向上追溯的结构就是原型链。
关键点在于:原型链只在读取或调用对象属性/方法时触发,且仅作用于对象实例与构造函数之间的继承关系。它不涉及变量名、函数声明或 let/const 声明的解析。
作用域链是变量名查找的路径
当你写 console.log(x),引擎会从当前执行上下文的作用域开始查找变量 x:先查当前函数的局部变量,再查外层函数的变量,最后查全局对象(如 window 或 globalThis)。这条由嵌套函数定义位置决定的“词法嵌套层级”就是作用域链。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
它完全静态,在函数定义时就已确定,和调用位置无关。闭包之所以能访问外层变量,正是因为作用域链被保留在内部函数的执行上下文中。
两者核心差异:目标不同、触发时机不同、构建依据不同
- 目标不同:原型链解决“对象有没有某个属性或方法”,作用域链解决“代码里写的变量名对应哪个值”
- 触发时机不同:原型链在属性访问(. 或 [])时动态查找;作用域链在变量求值(如 x + 1)或函数调用前就完成绑定
- 构建依据不同:原型链由对象创建方式决定(new、Object.create()、类继承等);作用域链由函数书写时的嵌套结构决定,与执行顺序无关
它们共有的底层逻辑:都是“先查自身,再沿链向上”
虽然对象和变量属于不同抽象层级,但 JavaScript 引擎统一采用“就近优先”的查找策略:
- 对 a.b:先查 a 自身,再查 a.__proto__,再查 __proto__.__proto__
- 对 x:先查当前执行上下文的词法环境,再查外层词法环境,最后查全局词法环境
这种一致性降低了引擎实现复杂度,也让开发者能用相似直觉理解两类查找行为——只是它们各自作用的“世界”泾渭分明:一个管对象结构,一个管变量绑定。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










