Object.getPrototypeOf()是获取对象原型的标准安全方法,返回其内部[[Prototype]]指向的对象,适用于各类对象且不受__proto__修改影响,优于constructor.prototype。

要获取对象的原型,最直接的方式是使用 Object.getPrototypeOf() 方法;而理解它的作用,必须结合 JavaScript 的原型链机制来看——每个对象内部都有一个隐式原型([[Prototype]]),它指向其构造函数的 prototype 对象。
Object.getPrototypeOf() 是标准、安全的取原型方式
该方法返回指定对象的原型(即内部 [[Prototype]] 指向的对象),兼容性好,且不会受 __proto__ 被改写或屏蔽的影响。
- 对普通对象:返回
Object.prototype - 对数组:返回
Array.prototype - 对函数:返回
Function.prototype - 对通过
Object.create(null)创建的对象:返回null
示例:
const obj = {};
console.log(Object.getPrototypeOf(obj) === Object.prototype); // true
const arr = [1, 2];
console.log(Object.getPrototypeOf(arr) === Array.prototype); // true
const F = function () {};
console.log(Object.getPrototypeOf(F) === Function.prototype); // true
原型链是一条由 __proto__ 连接起来的查找路径
当你访问对象的一个属性时,若自身没有,JS 引擎会沿着 [[Prototype]] 链向上查找,直到找到该属性或到达 null。这条链就是原型链。
每个对象的 [[Prototype]] 在创建时就被确定:
- 字面量对象(如
{})的原型是Object.prototype - 数组字面量(如
[])的原型是Array.prototype,而Array.prototype的原型是Object.prototype - 函数对象的原型是
Function.prototype,其原型又是Object.prototype
你可以用多次调用 Object.getPrototypeOf 来遍历整条链:
const obj = { a: 1 };
let proto = Object.getPrototypeOf(obj);
console.log(proto === Object.prototype); // true
const arr = [];
proto = Object.getPrototypeOf(arr);
console.log(proto === Array.prototype); // true
proto = Object.getPrototypeOf(proto);
console.log(proto === Object.prototype); // true
不要混淆 Object.getPrototypeOf 与 constructor.prototype
Object.getPrototypeOf(obj) 获取的是 实例的原型,而 obj.constructor.prototype 是尝试从构造函数反推原型——但这个方式不可靠:
- 如果
constructor被修改过(比如重写了prototype却没同步更新constructor),结果就错 - 箭头函数没有
prototype,obj.constructor.prototype会报错 - 用
Object.create(null)创建的对象没有constructor属性
所以始终优先用 Object.getPrototypeOf(),它是唯一规范、健壮的途径。
扩展:检查原型关系用 isPrototypeOf() 更语义化
如果你想判断某个对象是否在另一对象的原型链上,用 A.isPrototypeOf(B) 比手动遍历更清晰:
const parent = { x: 1 };
const child = Object.create(parent);
console.log(parent.isPrototypeOf(child)); // true
console.log(Object.prototype.isPrototypeOf(child)); // true
console.log(Array.prototype.isPrototypeOf(child)); // false
这比反复调用 Object.getPrototypeOf 判断更简洁、意图更明确。

















