JavaScript中的Object.getPrototypeOf怎么用?

来源:APP编程网作者:湖南程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《JavaScript中的Object.getPrototypeOf怎么用?》,敬请观看详情。很多JavaScript开发者在学习原型相关知识时,会对Object.getPrototypeOf方法的使用场景和具体用法感到困惑。该方法主要用于获取指定对象的原型,是操作原型链的重要工具。本文将详细介绍Object.getPrototypeOf的基本语法、参数要求、返回值规则,同时结合实际代码示例讲解它在原型判断、原型链追溯等场景下的应用,还会说明使用时的注意事项,帮助开发者快速掌握这个方法的正确使用方式,解决实际开发中遇到的原型相关问题。

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

JavaScript中的Object.getPrototypeOf怎么用?

基本语法与参数说明

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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。