object.getprototypeof返回对象自身的[[prototype]]内部槽值,仅当对象通过new constructor()创建且原型未被修改时才等于constructor.prototype;否则不等,如object.create(null)、手动改原型或内置函数自身。

Object.getPrototypeOf 返回的是对象自身的 [[Prototype]] 内部槽所指向的对象,它和构造函数的 prototype 属性**没有必然相等关系**,只在特定创建方式下“碰巧一致”。
什么时候两者相等?
仅当对象是通过标准 new Constructor() 创建,且原型未被修改时:
-
const d = new Date(); Object.getPrototypeOf(d) === Date.prototype✅ -
const arr = [1, 2]; Object.getPrototypeOf(arr) === Array.prototype✅ -
const obj = {}; Object.getPrototypeOf(obj) === Object.prototype✅(由规范约定,非因调用 Object 构造)
什么时候不相等?
以下情况会打破“相等”的直觉:
-
Object.create(null)创建的对象:返回 null,而任何构造函数的prototype都不是null - 手动改过原型:
Object.setPrototypeOf(obj, {})后,Object.getPrototypeOf(obj)就是那个空对象,与原构造函数无关 - 内置函数本身:
Object.getPrototypeOf(Function)是Function.prototype,但Function.prototype是给普通函数实例用的,并非 Function 的“构造器原型”——它的作用是定义所有函数共有的方法(如call、bind),而非描述 Function 自身怎么被构造
constructor 属性不可靠
别试图靠 obj.constructor.prototype 反推原型:
-
constructor是原型链上一个普通属性,可被覆盖、删除或继承错位 - 例如:
function F(){}; const o = new F(); o.constructor = null;→o.constructor.prototype报错,但Object.getPrototypeOf(o)仍是F.prototype - 真正起作用的只有内部 [[Prototype]] 槽,
Object.getPrototypeOf读取的就是它
__proto__ 和 Object.getPrototypeOf 的关系
它们行为完全一致:
-
obj.__proto__ === Object.getPrototypeOf(obj)在绝大多数引擎中为 true - 但
__proto__是非标准遗留属性,已被废弃;Object.getPrototypeOf是 ES5+ 正式 API,应优先使用 - 二者都只读取当前对象的直接原型,不涉及
constructor或构造函数的prototype属性











