Object.getPrototypeOf返回对象内部[[Prototype]]指向的对象,与构造函数prototype属性无必然关联:{}返回Object.prototype,[1,2]返回Array.prototype,function f(){}返回Function.prototype,Object.create(null)返回null,手动修改后则返回设定值。

不是,Object.getPrototypeOf 返回的是对象内部 [[Prototype]] 指针所指向的对象,它不总是等于某个构造函数的 prototype 属性。
它返回什么,取决于对象怎么创建
这个方法只读取对象自身的隐式原型链起点,和“谁构造了它”没有必然绑定:
- 普通对象
{}:返回Object.prototype(恰好等于Object.prototype,但不是因为Object构造函数“被调用”,而是语言规范设定) - 数组
[1, 2]:返回Array.prototype(对应Array构造函数的prototype) - 函数
function f(){}:返回Function.prototype(对应Function构造函数的prototype) -
Object.create(null)创建的对象:返回null(没有原型,自然不等于任何构造函数的prototype) - 用
Object.setPrototypeOf(obj, someObj)手动改过原型的对象:返回的就是你设的那个someObj,跟原始构造函数完全无关
最容易混淆的反例:Function 和 Object 本身
它们是函数,但它们的 [[Prototype]] 并不指向自己的 prototype 属性:
-
Object.getPrototypeOf(Function)→Function.prototype(没错) - 但
Function.prototype是供 普通函数实例 继承用的,不是Function自己的“构造器原型” -
Function.prototype的原型才是Object.prototype,而Object.prototype的原型是null - 所以
Object.getPrototypeOf(Object)也等于Function.prototype,不是Object.prototype
constructor 属性不是可靠的线索
很多开发者误以为“能通过 obj.constructor.prototype 反推原型”,但:
-
constructor是原型对象上的一个属性,可被覆盖、删除或继承错位 -
Object.getPrototypeOf(obj).constructor可能是undefined、Object,甚至完全无关的函数 - 真正决定原型链走向的,只有
[[Prototype]]内部槽,Object.getPrototypeOf读取的正是这个值,与constructor无关
什么时候会“碰巧相等”?
仅当对象是通过标准 new Constructor() 创建,且中间没被篡改原型时:
-
const x = new Date()→Object.getPrototypeOf(x) === Date.prototype -
const y = new MyClass()→Object.getPrototypeOf(y) === MyClass.prototype - 但这是一种约定行为,不是强制规则;ES 规范只要求
[[Prototype]]被设为该值,并不保证构造函数一定存在或未被修改

















