原型链是javascript继承的底层机制,通过__proto__链条实现属性方法查找,原型继承模式以child.prototype=new parent()建立链,组合继承则结合构造函数调用与原型链以兼顾属性隔离和方法共享。

原型链是 JavaScript 继承的底层机制,而“原型继承模式”本质上就是基于原型链构建的一套可复用、结构清晰的对象关系方案。它不是语法糖,也不是独立于语言之外的设计,而是直接贴合 JS 运行时本质的实践路径——用对了,代码轻量、逻辑透明;用偏了,容易掉进共享引用、constructor 错乱、构造函数重复执行等坑里。
原型链怎么支撑继承行为
所有继承效果都依赖对象内部的 __proto__ 链条:当你访问 obj.method(),JS 先查 obj 自身,没找到就顺着 __proto__ 找它的原型,再找原型的原型……直到 Object.prototype(终点为 null)。这个查找过程就是原型链在工作。
所谓“原型继承”,就是人为把子类原型(Child.prototype)设为父类实例(new Parent()),让这条链自然延伸过去。例如:
function Animal() { this.type = 'animal'; }Animal.prototype.speak = function() { console.log('sound'); };function Dog() { }-
Dog.prototype = new Animal();← 关键一步,建立链 const d = new Dog(); d.speak(); // 正常输出
原型继承模式的典型实战写法
纯原型链继承虽简洁,但有硬伤(如引用属性共享、无法传参)。实际项目中更常用的是组合继承——它把原型链和构造函数调用配合使用:
- 在
Dog构造函数内用Animal.call(this, name)初始化实例属性,确保每个new Dog()拥有独立的name、colors等 - 用
Dog.prototype = new Animal()接入父类方法,实现speak、move等复用 - 补一句
Dog.prototype.constructor = Dog,否则new Dog()实例的 constructor 会指向Animal
这种写法兼顾了属性隔离与方法共享,ES6 class 底层也是这样模拟的。
容易忽略但影响深远的细节
几个关键点不处理,上线后可能引发隐蔽问题:
-
引用类型属性污染:如果
Animal构造函数里写了this.tags = [],所有Dog实例会共用一个数组。修复方式是只在构造函数中初始化,不在原型上挂引用值 -
两次执行父构造函数:组合继承中,
new Animal()设原型时执行一次,Animal.call(this)实例化时又执行一次。若父类含副作用(如发请求、绑定事件),就会出错 -
instanceof 判断失效:若忘了修
constructor,new Dog() instanceof Animal仍为 true,但new Dog().constructor === Animal会返回 true,破坏语义
现代替代方案值得了解
ES6 的 class + extends 是语法糖,背后仍是原型链;而更优的 寄生组合继承(用 Object.create(Parent.prototype) 替代 new Parent())能避免构造函数重复执行,是目前最干净的手动实现方式。不过对于多数业务场景,标准组合继承已足够稳定可靠。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











