javascript通过原型链模拟类继承,核心是让子构造函数的prototype指向父构造函数实例或其prototype,形成实例→子.prototype→父.prototype→object.prototype→null的查找链;es6 class是语法糖,底层仍基于此机制,但存在引用属性共享和无法传参两大缺陷。

JavaScript 本身没有类(class)的底层概念,所谓“类继承”其实是用原型链模拟出来的效果。核心思路是:让子构造函数的 prototype 指向父构造函数的一个实例(或其 prototype),从而在查找属性和方法时,能顺着 实例 → 子.prototype → 父.prototype → Object.prototype → null 这条链向上访问。
原型链继承的基本写法
这是最基础的模拟方式:
- 定义父构造函数,把共用方法挂到
Parent.prototype上 - 定义子构造函数,然后执行
Child.prototype = new Parent() - 手动修复
Child.prototype.constructor,否则它会指向Parent - 之后用
new Child()创建的实例,就能调用Parent.prototype上的方法
为什么能“像类一样”工作
因为 JavaScript 引擎在访问一个对象属性时,会自动按顺序查找:
- 先查实例自身(
this上有没有) - 没有就查
this.__proto__(即Child.prototype) - 还没就查
Child.prototype.__proto__(即Parent.prototype) - 再往上是
Object.prototype,最后到null
这个逐层查找的过程,视觉上就像子类“继承”了父类的方法——其实只是共享了同一个原型对象。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
ES6 class 的本质没变
class 和 extends 是语法糖,编译后仍走原型链:
-
class Animal { speak() { ... } }→ 实际是Animal.prototype.speak = function() {...} -
class Dog extends Animal→ 底层等价于Dog.prototype = Object.create(Animal.prototype) -
super()在构造器里 → 实际是Animal.call(this, ...),只负责初始化实例属性
原型链继承的两个硬伤
单独使用会有明显问题,所以实际开发中很少直接这么写:
-
引用类型属性被所有实例共享:比如父构造函数里
this.colors = ['red'],子类多个实例会共用同一个数组,一改全改 -
无法给父构造函数传参:因为
Child.prototype = new Parent()是在定义阶段执行的,不是每次new Child(name)时才调用Parent
要解决这些问题,通常会组合使用构造函数继承(call/apply)、寄生组合式继承等方案。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










