class继承后方法查找仍沿[[prototype]]链向上,如dog.eat()依次查dog→dog.prototype→animal.prototype→object.prototype;super调用等价于object.getprototypeof(dog.prototype).eat.call(this);静态方法需手动设置构造函数继承链。

Class 继承后的原型链方法查找逻辑,本质没变——还是沿着 [[Prototype]] 链逐级向上找,只是写法更简洁、语义更清晰。ES6 的 class 和 extends 是语法糖,底层完全依赖原型机制。
继承后实例的原型链结构
比如:
class Animal {
constructor(name) { this.name = name; }
eat() { console.log('eating'); }
}
class Dog extends Animal {
constructor(name, breed) {
super(name);
this.breed = breed;
}
bark() { console.log('barking!'); }
}
const dog = new Dog('Leo', 'Golden');
此时 dog 的原型链是:
-
dog→ 自身(含name、breed) - →
Dog.prototype(含bark) - →
Animal.prototype(含eat) - →
Object.prototype(含toString、valueOf等) - →
null
这个链条不是靠手动赋值,而是 extends 自动设置:Dog.prototype.__proto__ 指向 Animal.prototype。
方法调用时的实际查找路径
执行 dog.eat() 时,JS 引擎按顺序检查:
- 先看
dog自身有没有eat属性(没有) - 再查
Dog.prototype(也没有) - 接着查
Dog.prototype.__proto__,也就是Animal.prototype(找到了eat方法) - 立即执行,不再继续往上
同理,dog.toString() 会跳过前三层,最终在 Object.prototype 上找到。
注意:super 不是“指向父类”,而是调用原型上的方法
在 Dog 的方法里写 super.eat(),等价于:
Object.getPrototypeOf(Dog.prototype).eat.call(this)- 即明确从当前对象的直接原型(
Animal.prototype)上调用eat
它不依赖构造函数名,也不关心是否用了 class,只依赖运行时的原型链结构。
静态方法和原型方法的查找是两套路径
Dog.eat() 会失败(Dog 自身没 eat),但 Dog 可以有静态方法:
class Dog extends Animal { static info() { return 'Dog class'; } }-
Dog.info()查找的是Dog构造函数自身,不是它的原型链 -
Animal的静态方法不会自动被Dog继承,除非显式设置:Object.setPrototypeOf(Dog, Animal)
也就是说:实例方法走实例的 [[Prototype]] 链;静态方法走构造函数自身的继承链(Function.prototype 那条,且需手动设置)。











