原型链是javascript对象系统的底层骨架,决定属性访问路径、继承机制、动态行为及类型识别,所有对象通过__proto__与函数的prototype连接形成可追溯的查找通路。

原型链不是 JS 的附加功能,而是整个对象系统运转的底层骨架。它不依赖 class、不靠编译时检查,而是直接嵌在运行时的对象查找机制里——每次你写 obj.method() 或 obj.prop,引擎就在走这条链。
它是 JavaScript 对象模型的执行路径
JS 中没有“类实例”的内存结构,只有普通对象。当你用 new Func() 创建对象,引擎做的关键一步是:把新对象的 __proto__ 指向 Func.prototype。这个链接不是装饰,是属性访问的必经之路。
- 所有对象(除 null)都有
__proto__,它决定“去哪找” - 所有函数(非箭头)都有
prototype,它决定“被谁找” - 这两者一接上,就形成可追溯、可干预的查找通路
它是继承与共享的唯一基础设施
ES6 的 class、extends、甚至 Array、Date 这些内置类型,背后全是原型链在驱动。所谓“继承”,本质就是让子构造函数的 prototype.__proto__ 指向父构造函数的 prototype。
-
Array.prototype.push能被每个数组调用,是因为所有数组的__proto__最终都连到Array.prototype -
toString()所有对象都能用,是因为链最终抵达Object.prototype - 删掉
Object.prototype.toString,所有对象的toString都会失效
它是动态行为的承载层
你可以在运行时随时修改任意对象的原型或原型上的方法,所有已存在和未来创建的实例都会立即响应——这种灵活性不是设计亮点,而是架构必然。
- 给
String.prototype加个isEmail(),所有字符串立刻拥有该方法 - 重写
Array.prototype.map,所有数组的map行为同步改变 - Vue 2 的响应式依赖收集、React 的事件代理,都借用了原型链的拦截与转发能力
它定义了 JS 的“类型边界”
JS 没有编译期类型系统,但原型链天然划出了一条隐式契约:一个对象能做什么,取决于它链上有什么。判断 obj instanceof Array,实际就是在检查 obj.__proto__ 是否在 Array.prototype 的上游链中。
-
typeof []返回"object",没用;真正识别数组靠的是原型链位置 -
Array.isArray()内部也是顺着__proto__查到Array.prototype - 自定义类型能否被正确识别,取决于你是否维护了干净、可追溯的原型连接











