Object.getPrototypeOf 的核心作用是安全读取对象内部 [[Prototype]] 值,但受目标对象状态、返回值类型(仅限对象或 null)及运行时环境严格约束:返回原始值抛 TypeError;不可扩展对象强制返回真实原型;__proto__ 不可写时必须匹配当前值;Proxy trap 在非扩展且原型为 null 时必须返回 null,否则报错。

Object.getPrototypeOf 的核心作用是安全读取对象内部 [[Prototype]] 值,但它不是万能的——它的行为受目标对象状态、返回值类型和运行时环境严格约束。用错边界,轻则返回意外结果,重则直接抛错。
返回值必须是对象或 null
该方法不允许返回原始值(如 undefined、42、"foo" 或 boolean),否则会立即抛出 TypeError:
- 返回 undefined:常见于忘记 return 的 Proxy
getPrototypeOftrap,直接报错 - 返回 字符串 或 数字:违反规范,浏览器与 Node.js 均拒绝执行
- 返回 null 是合法终点,表示原型链终止(例如
Object.getPrototypeOf(Object.prototype))
目标对象不可扩展时,返回值被强制锁定
若目标对象已被 Object.preventExtensions() 冻结,getPrototypeOf 就不能再“伪造”原型:
- 此时必须返回当前真实原型,即
Object.getPrototypeOf(target)的原始值 - 试图返回其他对象(哪怕是同构的副本)也会触发 TypeError
- 这是防止原型劫持的关键防护机制,调试时需先检查
Object.isExtensible(target)
__proto__ 属性不可写时,返回值必须匹配
当目标对象的 __proto__ 属性被设为不可写(通过 Object.defineProperty 显式配置 writable: false),其原型就不可变更:
- Object.getPrototypeOf 必须返回与该属性当前值一致的对象
- Proxy 中若 trap 返回不一致值,同样报错
- 这种限制在类库封装或沙箱环境中较常见,容易被忽略
Proxy 拦截中的特殊限制
在 Proxy 的 getPrototypeOf trap 中,还有两个隐性但关键的约束:
- 若目标对象是
non-extensible,且其原型为null,trap 必须返回null,不能返回空对象 - 若目标对象原型本身不可写(如
Object.freeze(Object.prototype)),trap 返回值必须与之完全相等(===),不能是结构相同的新对象

















