JavaScript类继承本质是原型链委托,class/extends为语法糖;Dog.prototype.__proto__指向Animal.prototype,Dog.__proto__指向Animal;实例查找路径为dog→Dog.prototype→Animal.prototype→Object.prototype→null;constructor需手动维护;super()等价于Animal.call(this)。

JavaScript 中的“类继承”不是真正意义上的类复制,而是通过原型链建立委托关系。class 和 extends 是语法糖,背后仍是 __proto__ 和 prototype 的链接操作。
class 声明会自动设置两条关键原型链
当你写 class Animal {} 和 class Dog extends Animal {} 时,引擎实际做了两件事:
-
Dog.prototype.__proto__ 指向 Animal.prototype:确保 new Dog() 实例能查到 Animal.prototype 上的方法(比如
eat()) -
Dog.__proto__ 指向 Animal:让 Dog 可以继承 Animal 的静态方法(比如
Animal.create())
实例的原型链走向很清晰
执行 const dog = new Dog() 后,它的完整查找路径是:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
dog自身(实例属性,如dog.name) - →
dog.__proto__即Dog.prototype - →
Dog.prototype.__proto__即Animal.prototype - →
Animal.prototype.__proto__即Object.prototype - →
Object.prototype.__proto__ === null(链终止)
constructor 属性需要手动维护
因为 Dog.prototype = Object.create(Animal.prototype) 会覆盖默认的 constructor,所以 extends 会自动补上:
立即学习“Java免费学习笔记(深入)”;
-
Dog.prototype.constructor === Dog(保持正确) - 如果不使用 class,手动实现时必须写
Dog.prototype.constructor = Dog,否则dog.constructor会指向Animal
super() 调用的本质是函数内 this 绑定
super() 在子类构造器中,等价于 Animal.call(this, ...args):
- 它不修改原型链,只负责把父类的实例属性(如
this.type)挂载到当前this上 - 原型链早已在定义
class Dog extends Animal时就搭好了

















