object.getprototypeof()是标准、安全且推荐的获取对象原型的方法,返回对象的[[prototype]],适用于普通对象、内置对象和自定义实例,并可配合while循环遍历原型链,比非标准的__proto__更可靠。

你可以用 Object.getPrototypeOf() 方法直接获取任意对象的原型(即它的 [[Prototype]]),这是标准、安全且推荐的方式,比访问非标准的 __proto__ 更可靠。
基本用法:获取对象的直接原型
该方法接收一个对象作为参数,返回它的内部原型对象(也就是构造函数的 prototype 属性所指向的对象):
- 对普通对象(如字面量
{}或Object.create(null)创建的),它返回Object.prototype或null; - 对数组、日期、正则等内置对象,返回对应的原型,如
Array.prototype、Date.prototype; - 对自定义构造函数创建的实例,返回该构造函数的
prototype对象。
示例:
const obj = {};
console.log(Object.getPrototypeOf(obj) === Object.prototype); // true
const arr = [1, 2, 3];
console.log(Object.getPrototypeOf(arr) === Array.prototype); // true
function Person() {}
const p = new Person();
console.log(Object.getPrototypeOf(p) === Person.prototype); // true
配合 while 循环遍历整个原型链
原型链是一条由 [[Prototype]] 链接起来的对象链,终点是 null。你可以用 Object.getPrototypeOf() 搭配循环逐级向上获取:
- 每次调用都得到当前对象的直接原型;
- 当返回
null时,说明已到达原型链顶端; - 注意避免无限循环(正常情况下不会,但若原型被意外篡改可能出问题)。
示例(打印原型链路径):
function logPrototypeChain(obj) {
let current = obj;
while (current !== null) {
console.log(current);
current = Object.getPrototypeOf(current);
}
}
logPrototypeChain({a: 1});
// 输出:{a: 1} → Object.prototype → null
与 constructor 和 prototype 的关系
Object.getPrototypeOf(obj) 返回的值,通常等于 obj.constructor.prototype —— 但这不是绝对的,因为 constructor 属性可被修改或丢失:
- 如果对象的
constructor被重写或未继承,obj.constructor.prototype可能不准确; -
Object.getPrototypeOf()始终反映真实的原型链接,更可信; - 判断原型关系推荐用
obj instanceof Constructor或Object.getPrototypeOf(obj) === Constructor.prototype。
和 __proto__ 的区别
__proto__ 是早期浏览器实现的非标准属性,虽被广泛支持,但已被 ES6 标准列为“废弃(deprecated)”;而 Object.getPrototypeOf() 是 ECMAScript 标准方法:
- 前者可读可写(不推荐修改),后者只读;
- 前者在某些环境(如严格模式下的某些操作)可能受限,后者始终可用;
- 现代代码应优先使用
Object.getPrototypeOf()获取原型。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











