Object.getPrototypeOf是JavaScript内置的用于获取对象原型的方法,它可以直接返回指定对象的原型对象,是理解和使用原型链的核心API之一,在对象属性查找、原型关系判断等场景中都有广泛应用。

基本语法与参数说明
Object.getPrototypeOf的语法非常简单,只有一个必填参数,具体格式如下:
Object.getPrototypeOf(obj)
参数obj表示要获取原型的对象,这个参数可以是任意类型的JavaScript值,不过如果传入的不是对象类型,方法会先将该值转换为对应的对象包装类型再获取原型。
方法的返回值是参数obj的原型对象,如果obj没有原型(比如通过Object.create(null)创建的对象),则返回null。
基础使用示例
下面通过几个简单的示例来演示Object.getPrototypeOf的基本用法:
// 示例1:普通对象的原型
const obj = {};
const proto = Object.getPrototypeOf(obj);
console.log(proto === Object.prototype); // 输出 true,普通对象的原型是Object.prototype
// 示例2:数组的原型
const arr = [];
const arrProto = Object.getPrototypeOf(arr);
console.log(arrProto === Array.prototype); // 输出 true,数组的原型是Array.prototype
// 示例3:自定义构造函数的实例原型
function Person(name) {
this.name = name;
}
const person = new Person('张三');
const personProto = Object.getPrototypeOf(person);
console.log(personProto === Person.prototype); // 输出 true,实例的原型是构造函数的prototype属性特殊场景下的表现
在一些特殊场景下,Object.getPrototypeOf的行为需要特别注意:
- 如果传入的参数是原始类型值,会先转换为对应的包装对象再获取原型。比如传入数字1,会先转换为Number对象,再返回Number.prototype。
- 如果传入的是通过
Object.create(null)创建的无原型对象,方法会返回null。 - 如果传入
null或者undefined,会直接抛出TypeError,因为这两个值无法转换为对象。
对应的验证代码如下:
// 原始类型参数测试
console.log(Object.getPrototypeOf(1) === Number.prototype); // 输出 true
console.log(Object.getPrototypeOf('str') === String.prototype); // 输出 true
// 无原型对象测试
const nullProtoObj = Object.create(null);
console.log(Object.getPrototypeOf(nullProtoObj)); // 输出 null
// null/undefined参数测试
try {
Object.getPrototypeOf(null);
} catch (e) {
console.log(e instanceof TypeError); // 输出 true
}与原型链相关的应用
Object.getPrototypeOf可以用来追溯对象的完整原型链,也可以判断两个对象是否存在原型继承关系:
// 追溯原型链
function getPrototypeChain(obj) {
const chain = [];
let current = obj;
while (current) {
chain.push(current);
current = Object.getPrototypeOf(current);
}
return chain;
}
const arr = [];
console.log(getPrototypeChain(arr));
// 输出 [Array实例, Array.prototype, Object.prototype, null对应的原型链节点]
// 判断原型继承关系
function isPrototypeOf(obj, targetProto) {
let current = Object.getPrototypeOf(obj);
while (current) {
if (current === targetProto) {
return true;
}
current = Object.getPrototypeOf(current);
}
return false;
}
console.log(isPrototypeOf([], Array.prototype)); // 输出 true
console.log(isPrototypeOf([], Person.prototype)); // 输出 false使用注意事项
使用Object.getPrototypeOf时需要注意以下几点:
- 不要和
obj.__proto__混淆,虽然两者都能获取原型,但__proto__是浏览器早期实现的属性,并非标准API,而Object.getPrototypeOf是ES5标准定义的方法,兼容性更好,推荐使用。 - 原型对象是可变的,如果在获取原型之后修改了构造函数的
prototype属性,已经创建的实例的原型不会自动更新,因为实例的原型引用的是之前的原型对象。 - 该方法返回的是对象的隐式原型,和构造函数的显式原型
prototype是不同的概念,只有在构造函数实例的原型才和构造函数的prototype相等。
需要注意的是,虽然可以通过Object.getPrototypeOf获取原型,但不建议频繁修改对象的原型,这会影响JavaScript引擎的属性查找性能,还可能导致代码逻辑混乱。
总结
Object.getPrototypeOf是JavaScript中操作原型的核心方法,通过它可以准确获取任意对象的原型,进而实现原型链追溯、继承关系判断等功能。使用时要注意参数的类型限制,优先选择该方法而不是非标准的__proto__属性,同时避免随意修改原型对象,保证代码的性能和可维护性。
Object.getPrototypeOf原型链JavaScript对象原型修改时间:2026-06-07 03:22:56