掌握javascript继承的核心是让子类实例拥有父类属性并能访问其方法,本质是原型链委托查找机制;推荐es6 class+extends,次选寄生组合继承,需规避引用类型共享和constructor指向丢失问题。

快速掌握 JavaScript 继承的核心写法,关键不是背六七种方案,而是抓住两个底层动作:让子类实例拥有父类的属性,同时能访问父类的方法。所有继承方式都是围绕这两点做不同组合,ES6 的 class 本质也是封装了这些逻辑。
先搞懂原型链这根“线”
JavaScript 没有真正意义上的类继承,只有对象通过 __proto__ 向上委托查找的机制。子类实例调用一个方法时,引擎会按顺序查找:自己身上 → 构造函数的 prototype → 父类的 prototype → Object.prototype → null。这个链条就是继承生效的基础。
- 每个函数都有
prototype属性,它默认带一个constructor指回自身 - 每个实例对象都有
__proto__,它指向其构造函数的prototype - 修改原型上的方法,所有已存在和新创建的实例都能立刻使用
记住三种最实用的写法组合
日常开发中,90% 场景靠以下三种方式就能覆盖,不需要从原型链继承开始逐个试错:
-
ES6 class + extends(推荐首选):语法简洁,语义清晰,底层自动处理原型链和
super()调用。子类必须在constructor中第一行调用super(),否则报错;静态方法、实例方法、get/set都能自然继承 -
组合继承(手动实现 class 底层逻辑):在子类构造函数里用
Parent.call(this, ...args)继承实例属性,在子类prototype上用new Parent()继承原型方法。注意要修复constructor指向,否则instance.constructor会错指到父类 -
寄生组合继承(优化版组合):用
Object.create(Parent.prototype)替代new Parent()设置子类原型,避免父类构造函数被调用两次。这是 Babel 编译class时实际生成的代码模式
避开两个高频坑点
刚上手容易栽在这两处,看懂就少走半天弯路:
-
引用类型属性共享问题:如果父类构造函数里写了
this.arr = []或this.obj = {},用原型链继承会导致所有子实例共用同一份数据。解决办法是改用借用构造函数(call),或把这类属性移到构造函数内初始化 -
constructor 指向丢失:只要重写了子类的
prototype(比如Child.prototype = new Parent()),就必须手动加一句Child.prototype.constructor = Child,否则new Child()实例的constructor会指向Parent
用一句话收尾
写继承时,先问自己:属性要不要每个实例独有一份?方法要不要所有实例复用?前者决定是否用 call,后者决定是否连原型链;class 就是把这两个动作打包成一行语法,背后没玄机。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











