JavaScript类继承本质是原型链驱动,class为语法糖;构造函数负责实例属性初始化,prototype承载共享方法并构建继承链,constructor需手动修复以确保正确指向。

JavaScript 中的“类继承”本质仍是原型链驱动,class 只是语法糖,真正起作用的是构造函数与 prototype 的配合。理解它们如何协同,关键在于看清三件事:谁负责初始化实例、谁负责共享方法、谁串联起继承关系。
构造函数决定实例属性和初始状态
构造函数(constructor)在 new 时执行,它直接向新对象(即实例)写入自有属性。这些属性不共享,每个实例独有一份。
- 比如
class Dog extends Animal { constructor(name, breed) { super(name); this.breed = breed; } },this.breed是实例自身的属性,不会被其他Dog实例影响。 -
super(name)实际调用的是父类构造函数,把name挂到当前实例上——这属于“构造函数继承”,解决的是数据隔离问题。
prototype 对象承载共享方法与继承入口
每个类(或构造函数)都有一个 prototype 属性,它是一个普通对象,专门存放所有实例共用的方法和可继承的属性。
-
Dog.prototype默认指向一个对象,其constructor指回Dog;这个对象的[[Prototype]](即__proto__)被自动设为Animal.prototype(ES6extends自动完成)。 - 所以当你调用
myDog.eat(),引擎先查myDog自身 → 没有 → 查myDog.__proto__(即Dog.prototype)→ 还没有 → 再查Dog.prototype.__proto__(即Animal.prototype)→ 找到了eat。
继承链条由 prototype 链与 [[Prototype]] 链共同维持
类继承中,两条链同步建立:
立即学习“Java免费学习笔记(深入)”;
-
显式链:通过
Dog.prototype = Object.create(Animal.prototype)(或extends自动完成),让子类的prototype对象继承父类的prototype方法。 -
隐式链:每个
Dog实例的[[Prototype]]指向Dog.prototype,而Dog.prototype的[[Prototype]]又指向Animal.prototype,最终连到Object.prototype → null。 -
instanceof就是靠这条隐式链判断的:myDog instanceof Animal成立,是因为Animal.prototype出现在myDog的原型链上。
constructor 属性需要手动修复(常被忽略)
当用 Object.create(Animal.prototype) 替换 Dog.prototype 后,新对象的 constructor 会指向 Animal,而非 Dog。这会影响调试和某些依赖 constructor 的逻辑。
- 必须补一句:
Dog.prototype.constructor = Dog; - ES6
class会自动维护这个指向,但手写原型继承时这是必要步骤。


















