object.getprototypeof返回对象的内部[[prototype]],是标准api;__proto__是非标准遗留属性。前者安全只读,后者已被废弃但部分引擎仍支持。

Object.getPrototypeOf 返回什么,和 __proto__ 有什么区别
Object.getPrototypeOf 返回指定对象的原型(即其内部 [[Prototype]] 指向的对象),是标准、安全、只读的获取方式。它和对象的 <strong>proto</strong> 属性行为一致,但 <strong>proto</strong> 是非标准遗留属性,已被废弃(尽管多数引擎仍支持);而 Object.getPrototypeOf 是 ES5+ 正式 API,推荐在生产代码中使用。
-
Object.getPrototypeOf(null)抛出TypeError(不能对 null 调用) -
Object.getPrototypeOf({})返回Object.prototype - 对于数组:
Object.getPrototypeOf([1,2])返回Array.prototype,不是Object.prototype - 不会触发 getter,纯读取内部原型引用
如何用 Object.getPrototypeOf 遍历完整原型链
要看到整个继承路径(比如从实例 → 构造函数原型 → Object.prototype → null),需循环调用 Object.getPrototypeOf,直到返回 null:
function getPrototypeChain(obj) {
const chain = [];
let current = obj;
while (current !== null) {
chain.push(current);
current = Object.getPrototypeOf(current);
}
return chain;
}
- 注意:起点对象本身也计入链中(如
getPrototypeChain(new Date())第一项是Date实例) - 如果只想看“原型部分”,可从
Object.getPrototypeOf(obj)开始循环 - 箭头函数、原始值(
123、"str")无法直接传入 —— 它们没有原型链;包装对象(如new Number(123))才可以
为什么 Object.getPrototypeOf(Function) !== Function.prototype
这是最容易混淆的点:函数对象本身也是对象,它的原型是 Function.prototype,但 Function 构造器的 prototype 属性是供其实例(即普通函数)继承用的。
-
Object.getPrototypeOf(Function)→Function.prototype✅ -
Function.prototype→Object.prototype -
Object.getPrototypeOf(Function) === Function.prototype是 true - 但
Function.<strong>proto</strong> === Function.prototype也是 true(验证了上一条) - 常见误判:以为
Function.prototype是“函数的原型”,其实它是“所有函数实例”的原型,而Function自身作为函数,也遵循该规则
关键在于区分:
- 构造器的
prototype属性(用于 new 出来的实例的原型) - 实例的内部
[[Prototype]](由Object.getPrototypeOf暴露)
在 class 继承中用 Object.getPrototypeOf 查看 super 链是否生效
ES6 class 的 extends 会自动设置子类构造函数的 [[Prototype]] 指向父类构造函数,同时子类 prototype 的 [[Prototype]] 指向父类 prototype。可用 Object.getPrototypeOf 验证这两层:
class A {}
class B extends A {}
console.log(Object.getPrototypeOf(B) === A); // true —— B 继承自 A(构造器层级)
console.log(Object.getPrototypeOf(B.prototype) === A.prototype); // true —— B.prototype 继承自 A.prototype(实例层级)
- 如果漏写
super()在子类 constructor 中,不影响原型链结构,只影响实例初始化 - 修改
B.prototype后再设Object.setPrototypeOf(B.prototype, ...)可能破坏 instanceof 判断,慎用 -
Object.getPrototypeOf无法反映Symbol.hasInstance或其他自定义逻辑,它只读取底层[[Prototype]]
原型链不是扁平列表,而是带分支的隐式引用关系;Object.getPrototypeOf 只给你其中一条向上的指针,想看清全貌,得自己顺着走,而且每一步都可能被 Object.setPrototypeOf 或 <strong>proto</strong> 动态改写。










