理解原型链关键在于观察对象实际链接关系而非死记规范,需动手验证、可视化结构,明确prototype与__proto__的区别及标准api用法。

原型链不是靠“背规范”理解的,而是靠观察对象之间的实际链接关系。查阅文档规范(如ECMAScript标准)能帮你确认行为边界,但真正理清继承路径,关键在动手验证和结构可视化。
看懂构造函数与 prototype 的绑定关系
每个函数(包括自定义构造函数和内置函数)创建时,JavaScript 引擎自动为其添加 prototype 属性,它指向一个默认对象,该对象自带 constructor 指回原函数,并且其内部 [[Prototype]] 指向 Object.prototype。
- Person.prototype 不是 Person 的原型,而是 Person 实例的原型
- Person.prototype.constructor === Person 是默认设置,手动重写 prototype 后需主动修复
- Function.prototype 和 Object.prototype 都是特殊对象,它们自身也是函数或对象,因此也遵循同一套链式规则
追踪实例的 __proto__ 链而非只看代码声明
实例对象的继承路径由其内部 [[Prototype]](可通过 Object.getPrototypeOf() 安全读取)决定,不是由代码书写顺序决定。例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
const a = new Person()→Object.getPrototypeOf(a) === Person.prototype Object.getPrototypeOf(Person.prototype) === Object.prototype-
Object.getPrototypeOf(Object.prototype) === null(链终点)
用浏览器控制台输入 console.log(a.__proto__, a.__proto__.__proto__, a.__proto__.__proto__.__proto__) 可直观看到三层链,最后一层为 null。
区分 prototype 和 __proto__ 的角色
prototype 是函数才有的显式属性,用于指定将来 new 出来的实例的原型;__proto__ 是所有对象(包括函数)都有的隐式原型引用,指向它的原型对象。二者在多数情况下值相同,但语义完全不同:
- Person.prototype 是设计时设定的“模板原型”
- a.__proto__ 是运行时 a 对象“实际继承自谁”的快照
- 修改 Person.prototype 会影响所有已有和未来的实例(因为它们的 __proto__ 指向同一个对象)
用标准方法验证继承路径,避开非规范操作
ECMAScript 规范明确不推荐直接访问 __proto__(虽仍支持),应优先使用标准 API:
-
Object.getPrototypeOf(obj)替代obj.__proto__ -
Object.setPrototypeOf(obj, proto)替代赋值obj.__proto__ = ... -
Object.create(proto)创建指定原型的新对象,比手动改 __proto__ 更清晰、更符合规范意图 -
obj instanceof Constructor本质就是沿着 obj 的 [[Prototype]] 链向上查是否出现 Constructor.prototype
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










