推荐使用 object.getprototypeof() 而非 proto__,因其是 es5 标准方法,语义明确、兼容性好、严格模式可用,且不污染实例属性空间;__proto 是已弃用的非标准遗留属性。

直接调用 Object.getPrototypeOf(instance) 即可标准、安全、优雅地获取实例的隐式原型(即其内部 [[Prototype]] 指向的对象)。
为什么推荐 Object.getPrototypeOf 而不是 __proto__
__proto__ 是非标准的遗留属性,虽被多数引擎支持,但已被明确标记为“已弃用”;而 Object.getPrototypeOf() 是 ECMAScript 标准定义的规范方法,语义清晰、行为稳定、兼容性好,且不会污染实例自身属性空间。
基本用法与注意事项
- 参数必须是对象(包括数组、函数、日期等),传入原始值(如
42、"hello"、null、undefined)会抛出TypeError - 对于普通对象,返回其构造函数的
prototype对象;对于通过Object.create(null)创建的对象,返回null - 它只读获取,不支持赋值——如需修改原型链,请使用
Object.setPrototypeOf()(仅限调试/特殊场景,生产慎用)
常见实用场景示例
判断实例是否继承自某个原型:
const animal = { eats: true };
const rabbit = Object.create(animal);
console.log(Object.getPrototypeOf(rabbit) === animal); // true
在类继承中验证原型链:
class Animal {}
class Rabbit extends Animal {}
const r = new Rabbit();
console.log(Object.getPrototypeOf(r) === Rabbit.prototype); // true
console.log(Object.getPrototypeOf(Rabbit.prototype) === Animal.prototype); // true
与 constructor.prototype 的区别
obj.constructor?.prototype 并不可靠:constructor 可被篡改,且某些对象(如用 Object.create(null) 创建的)根本无 constructor 属性。而 Object.getPrototypeOf(obj) 始终准确反映运行时真实的 [[Prototype]] 链接,不依赖任何可变属性。











