javascript原型链继承的本质是让对象通过[[prototype]]链向上查找另一对象的属性和方法,核心是__proto__隐式链接与逐级查找机制,最终止于object.prototype→null。

JavaScript 中原型链实现对象继承,本质是让一个对象能沿着 [[Prototype]] 链向上查找另一个对象的属性和方法。它不靠“类声明”,而是靠对象之间隐式链接来复用行为。
核心机制:靠 __proto__ 或 Object.getPrototypeOf() 连接
每个对象内部都有一个隐藏链接 [[Prototype]](可通过 Object.getPrototypeOf(obj) 安全读取)。当访问 obj.xxx 时:
- 先查
obj自身是否有xxx; - 没有就去
Object.getPrototypeOf(obj)上找; - 还没找到,继续往上,直到抵达
Object.prototype; - 最终到
null停止查找。
这条路径就是原型链,也是继承发生的实际路线。
构造函数方式:子类 prototype 指向父类实例
这是最典型的原型链继承写法,适用于有构造函数的场景:
- 定义父构造函数(如
Animal),把共享方法挂到它的prototype上; - 定义子构造函数(如
Dog),然后执行Dog.prototype = new Animal(); - 手动修复
Dog.prototype.constructor = Dog,否则会指向Animal; - 新创建的
new Dog()实例,就能访问Dog.prototype→Animal.prototype→Object.prototype上的所有方法。
注意几个关键细节
这种继承方式看似简单,但容易踩坑:
-
引用类型属性会被所有实例共享:比如父构造函数里
this.hobbies = [],子类多个实例 push 后会互相影响; -
子类无法传参给父类构造逻辑:因为
new Animal()是在设置原型时执行的,不是在new Dog(name)时调用; -
constructor 属性容易丢失:重写
prototype后必须手动恢复,否则inst.constructor会错指; -
没有 super 调用机制:子类方法里不能直接调用同名父方法,得显式写
Animal.prototype.method.call(this)。
更现代的替代方案
ES6 的 class + extends 语法底层仍是原型链,但自动处理了 constructor 修复、super 支持、静态方法继承等问题。日常开发推荐用它;需要兼容老环境或深入理解机制时,才手动操作原型链。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











