原型链是实例与原型间只读、单向、动态的隐式连接路径,通过__proto__实时查找属性,修改原型即时生效,但重写prototype不更新已有实例的__proto__。

原型链的本质,是实例对象与原型对象之间一条只读、单向、动态可查的隐式连接路径。它不是静态拷贝,也不是编译时绑定,而是在每次属性或方法访问时实时触发的查找机制。
实例通过 __proto__ 指向原型,而非复制原型
每个实例对象内部都有一个隐藏链接 [[Prototype]](通常暴露为 __proto__),它直接引用构造函数的 prototype 对象。这个引用是“活”的——修改原型上的属性或方法,所有已存在的实例会立即感知到变化。
- 比如给
Person.prototype.sayHi = () => console.log('Hi'),哪怕const p = new Person()是在添加前创建的,p.sayHi()依然能正常运行 - 但若把整个
Person.prototype重新赋值(如Person.prototype = { ... }),已有实例的__proto__不会自动更新,仍指向旧原型对象
属性查找是逐级向上、即时发生的
当你写 obj.name,JS 引擎不会预存结果,而是按顺序检查:
- 先看
obj自身有没有name - 没有?就去
obj.__proto__找 - 还没找到?继续去
obj.__proto__.__proto__查,直到抵达Object.prototype,最终到null
这个过程每访问一次都执行一遍,所以原型上改了什么,下一次访问就能体现——不是缓存,是重查。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
constructor 和原型的双向标记维持关系清晰
原型对象默认带一个 constructor 属性,指向它的构造函数;而实例的 __proto__ 又指向该原型。这两者构成闭环标识:
-
p.__proto__ === Person.prototype→ 实例属于哪个构造函数 -
Person.prototype.constructor === Person→ 原型知道自己是谁造的 - 手动重写
prototype时若不恢复constructor,这个线索就断了
Object.create(null) 是打破链的特例
绝大多数对象最终都连到 Object.prototype,但用 Object.create(null) 创建的对象,其 __proto__ 直接为 null,没有继承任何默认方法(如 toString、hasOwnProperty)。这种“纯净对象”说明:原型链不是强制存在,而是由创建方式决定的动态结构。

















