object.getprototypeof可获取对象原型链上各级原型:实例→子类prototype→父类prototype;对dog实例调用两次得animal.prototype,多层继承可连续调用;子类中可用object.getprototypeof(dog.prototype).speak.call(this)显式调父类方法。

可以通过 Object.getPrototypeOf 获取实例或构造函数的原型对象,进而访问其上的方法。关键在于理解“父类原型”的实际指向——它不是语法上的 super,而是当前对象原型链上更上一层的原型对象。
获取实例的直接原型(即构造函数的 prototype)
对一个实例调用 Object.getPrototypeOf(obj),返回的是该实例的内部 [[Prototype]],也就是它的构造函数的 prototype 对象:
class Animal {
speak() { return 'Animal speaks'; }
}
class Dog extends Animal {
bark() { return 'Woof!'; }
}
const dog = new Dog();
console.log(Object.getPrototypeOf(dog) === Dog.prototype); // true
console.log(dog.speak()); // 'Animal speaks'(通过原型链自动访问)
向上获取父类的 prototype(即“父类原型”)
要拿到 Animal.prototype(也就是 Dog 的父类原型),需对 Dog.prototype 再调用一次 Object.getPrototypeOf:
const dogProto = Object.getPrototypeOf(dog); // Dog.prototype const animalProto = Object.getPrototypeOf(dogProto); // Animal.prototype console.log(animalProto.speak()); // 'Animal speaks' console.log(animalProto.constructor === Animal); // true
- 这相当于手动遍历原型链:实例 → 子类 prototype → 父类 prototype
- 不能直接对实例调两次
Object.getPrototypeOf得到父类 prototype,因为第一次就跳到了子类 prototype,第二次才是父类 prototype - 若继承多层(如 A → B → C),可连续调用多次获取更高层原型
在子类方法中显式调用父类原型方法
虽然通常用 super.method() 更安全,但也可用 Object.getPrototypeOf + call 显式绑定调用:
class Dog extends Animal {
speak() {
const parentProto = Object.getPrototypeOf(Dog.prototype);
return parentProto.speak.call(this) + ' — but as a dog';
}
}
-
Object.getPrototypeOf(Dog.prototype)等价于Animal.prototype - 必须用
.call(this)绑定this,否则方法内this会丢失 - 这种方式绕过了
super机制,在动态场景(如装饰器、代理)中有时更灵活
注意边界情况
- 对普通对象(非 class 实例)同样适用:
Object.getPrototypeOf({}) === Object.prototype - 对内置对象如
Array,Object.getPrototypeOf([])返回Array.prototype,再调一次得Object.prototype - 如果原型链已到
null(即顶端),再次调用会返回null,需做存在性判断











