__proto__是非标准但广泛支持的属性,用于读取或设置对象原型;应优先使用Object.getPrototypeOf()和Object.setPrototypeOf()等标准API替代。

在 JavaScript 中,__proto__ 是一个**非标准但被广泛支持的属性**,用于直接读取或设置对象的原型(即内部 [[Prototype]])。它不是推荐的现代写法,但在调试、学习原型链或某些兼容性场景中仍可能遇到。
如何用 __proto__ 访问原型对象
对任意对象,可以直接访问其 __proto__ 属性,得到它的原型对象:
-
obj.__proto__返回obj的原型(即构造函数的prototype对象) - 该值通常是一个对象,也可能是
null(如Object.create(null)创建的对象) - 注意:
__proto__是对象实例上的属性,不是构造函数本身的属性
示例:
const arr = [1, 2, 3]; console.log(arr.__proto__ === Array.prototype); // true console.log(arr.__proto__.__proto__ === Object.prototype); // true console.log(arr.__proto__.__proto__.__proto__); // null
设置原型:慎用 __proto__ 赋值
虽然可以写 obj.__proto__ = newProto 来修改原型,但这是**不推荐的动态操作**,性能差且不可靠:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 部分环境(如严格模式下某些引擎)可能禁止赋值
- 会破坏 V8 等引擎的优化(如隐藏类),影响运行速度
- 应优先使用标准替代方案:
Object.setPrototypeOf(obj, newProto)或创建时指定:Object.create(proto)
和 prototype 的区别别混淆
初学者常把 __proto__ 和 prototype 搞混:
-
__proto__是**实例对象**身上的属性,指向它的原型 -
prototype是**函数对象**(如构造函数)身上的属性,用于指定“将来用new创建的实例”的__proto__ - 即:
Constructor.prototype === instance.__proto__
现代推荐替代方案
为保持代码健壮与可维护性,建议用标准 API:
- 获取原型:
Object.getPrototypeOf(obj)(等价于obj.__proto__,但标准、安全) - 设置原型:
Object.setPrototypeOf(obj, proto)(明确意图,但依然避免频繁调用) - 创建指定原型的对象:
Object.create(proto, descriptors) - 检查原型关系:
obj instanceof Constructor或proto.isPrototypeOf(obj)

















