安全读取原型需确保参数为非空对象,避免对null、undefined或原始值调用Object.getPrototypeOf;遍历时须显式检查null终止;Proxy或DOM元素等特殊对象需注意原型访问限制;判断原型链关系推荐使用isPrototypeOf方法。

直接调用 Object.getPrototypeOf 本身是安全的,但“安全读取原型”的关键在于避免对 null 或非对象值调用,以及正确处理原型链末端(null)的情况。
只对对象类型调用 getPrototypeOf
该方法要求参数必须是对象(包括数组、函数、普通对象等),传入 null、undefined、原始值(如字符串、数字、布尔值)会抛出 TypeError。
- ✅ 正确:传入对象实例、构造函数、数组、日期等
- ❌ 错误:传入
"hello"、42、true、null、undefined
建议先用 typeof value === 'object' 且 value !== null 判断,或更稳妥地用 Object.prototype.toString.call(value) === '[object Object]'(注意:这不涵盖数组/函数等,所以推荐用 value != null && typeof value === 'object' 作为基础防护)。
处理原型链终点(null)
所有原型链最终都指向 null。当你到达顶层(例如 Object.getPrototypeOf(Object.prototype)),返回值就是 null。若后续代码未检查该返回值就继续调用 getPrototypeOf,会立即报错。
- 推荐在循环遍历原型链时,显式判断是否为
null并终止 - 例如:
let proto = obj; while (proto !== null) { console.log(proto); proto = Object.getPrototypeOf(proto); }
避免代理或特殊对象的陷阱
某些对象(如 Proxy、DOM 元素、部分内置对象)可能有不可枚举或受限的原型行为。虽然 Object.getPrototypeOf 仍能返回其内部 [[Prototype]],但不能保证该原型可被常规方式访问或修改。
- DOM 元素(如
document.createElement('div'))返回的原型是HTMLDivElement.prototype,合法可用 - Proxy 对象返回的是其
handler.getPrototypeOf的结果(若定义),否则是目标对象的原型;未定义时行为与普通对象一致 - 不必过度防御,但不要假设返回的原型一定有
constructor或可枚举属性
替代方案:用 Object.prototype.isPrototypeOf 更简洁
如果目的只是判断某个对象是否在另一对象的原型链上,不用手动遍历,直接用 SomeProto.prototype.isPrototypeOf(instance) 更安全、更语义化。
- 它自动跳过非对象输入(对原始值返回
false,不报错) - 无需关心
null终止问题 - 例如:
Array.prototype.isPrototypeOf([1,2])→true;Array.prototype.isPrototypeOf("str")→false

















