ES6的extends实现类继承,Object.getPrototypeOf用于检查原型链:B.prototype的原型是A.prototype,B的原型是A;可据此验证继承关系、遍历原型链或判断子类关系。

ES6 的 extends 是用于类继承的语法,而 Object.getPrototypeOf() 是获取对象(包括类实例或构造函数)原型的方法。两者本身不直接配合使用,但常在继承链调试、原型链遍历或模拟 instanceof 行为时一起出现——关键在于理解类继承背后的原型机制。
理解 extends 背后的原型关系
当用 class B extends A 时,JavaScript 会自动设置:
-
B.prototype的原型(即Object.getPrototypeOf(B.prototype))是A.prototype -
B构造函数自身的原型(即Object.getPrototypeOf(B))是A(实现“静态继承”,如继承A.foo)
这意味着你可以用 Object.getPrototypeOf 检查继承是否按预期建立。
检查实例的原型链
对一个实例对象,可用 Object.getPrototypeOf 逐级向上查其原型链,验证 extends 是否生效:
class Animal { speak() { return 'sound'; } }
class Dog extends Animal { bark() { return 'woof'; } }
const dog = new Dog();
console.log(Object.getPrototypeOf(dog) === Dog.prototype); // true
console.log(Object.getPrototypeOf(Dog.prototype) === Animal.prototype); // true
console.log(Object.getPrototypeOf(Animal.prototype) === Object.prototype); // true
判断类之间的继承关系(替代 instanceof 的静态方式)
有时需要在不创建实例的前提下确认类 B 是否继承自类 A。可结合 Object.getPrototypeOf 遍历构造函数的原型链:
function isSubclass(child, parent) {
let proto = Object.getPrototypeOf(child);
while (proto && proto !== Function.prototype) {
if (proto === parent) return true;
proto = Object.getPrototypeOf(proto);
}
return false;
}
console.log(isSubclass(Dog, Animal)); // true
console.log(isSubclass(Dog, Object)); // false(Dog 不直接继承自 Object 构造函数)
注意:不要混淆实例原型与构造函数原型
常见误区是误用 Object.getPrototypeOf 对象实例去比对类本身:
- ✅
Object.getPrototypeOf(dog) === Dog.prototype - ✅
Object.getPrototypeOf(Dog.prototype) === Animal.prototype - ❌
Object.getPrototypeOf(dog) === Animal(类型不匹配,一个是对象,一个是函数) - ❌
Object.getPrototypeOf(Dog) === Animal(虽然有时成立,但仅因extends设置了静态继承;应明确意图,避免隐式依赖)
不复杂但容易忽略。


















