应避免直接使用 __proto__,因其是非标准遗留属性,易混淆且严格模式下可能报错;推荐用标准API Object.getPrototypeOf() 获取原型,语义清晰、行为稳定、兼容性好。

用 Object.getPrototypeOf() 替代 __proto__ 是更规范、更安全的获取对象原型的方式,因为 __proto__ 是非标准的遗留属性,已被现代 JavaScript 规范明确不推荐使用(虽仍被多数引擎支持)。
为什么应该避免直接使用 __proto__
__proto__ 是早期浏览器实现的私有属性,不是 ECMAScript 标准的一部分。它容易引发混淆(比如和 prototype 属性搞混),且在严格模式下对不可扩展对象设置 __proto__ 会抛出错误。而 Object.getPrototypeOf() 是标准 API,语义清晰、行为稳定、兼容性好(ES5+ 支持)。
基本替代写法
把原来读取 obj.__proto__ 的地方,换成:
-
Object.getPrototypeOf(obj)—— 获取obj的原型对象(即内部 [[Prototype]] 指向的对象) - 例如:
Object.getPrototypeOf({}) === Object.prototype返回true - 对 null 或 undefined 调用会报错,使用前建议做类型检查
常见场景替换示例
以下是一些典型用法的对照:
立即学习“Java免费学习笔记(深入)”;
- 判断是否继承自某个构造函数:
obj.__proto__ === Array.prototype→Object.getPrototypeOf(obj) === Array.prototype - 沿原型链向上查找:
let p = obj.__proto__; while (p) { /* ... */; p = p.__proto__; }→let p = Object.getPrototypeOf(obj); while (p) { /* ... */; p = Object.getPrototypeOf(p); } - 检查对象是否为普通对象(排除数组、日期等):
obj.__proto__ === Object.prototype→Object.getPrototypeOf(obj) === Object.prototype
注意 setProto 的替代方案
__proto__ 还常被用于设置原型(如 obj.__proto__ = other),但这更危险且不推荐。标准替代是:
-
Object.setPrototypeOf(obj, newProto)—— 显式设置原型(但性能较差,应避免频繁调用) - 更优做法是创建时指定原型:
Object.create(proto)或使用 class / 构造函数 - 若需动态委托,优先考虑
Object.assign()或组合,而非修改原型链
不复杂但容易忽略。坚持用 Object.getPrototypeOf() 和 Object.setPrototypeOf(),代码更健壮,也更容易被工具和团队接受。


















