当前位置: 首页
前端开发
如何用原型链与 Object.getPrototypeOf 获取对象原型

如何用原型链与 Object.getPrototypeOf 获取对象原型

热心网友 时间:2026-04-23
转载

如何用原型链与 Object.getPrototypeOf 获取对象原型

如何用原型链与 Object.getPrototypeOf 获取对象原型

在Ja vaScript的世界里,要获取一个对象的原型,最直接、最规范的方法就是调用 Object.getPrototypeOf()。不过,要真正理解它的价值,还得从Ja vaScript那套独特的原型链机制说起——每个对象内部都有一个隐式的 [[Prototype]] 链接,它就像一条看不见的线,指向了其构造函数的 prototype 对象。

Object.getPrototypeOf():标准且安全的取原型方式

这个方法的设计初衷,就是返回指定对象内部那个 [[Prototype]] 链接所指向的对象。它的优势非常明显:兼容性好,是ECMAScript标准的一部分,而且完全不受非标准的 __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__ 串联的查找路径

原型链这个概念,可以说是Ja vaScript继承的基石。当你试图访问对象的一个属性时,如果对象自身没有,引擎不会就此放弃,而是会沿着那条内部的 [[Prototype]] 链一路向上查找,直到找到该属性,或者最终抵达链条的尽头——null

每个对象的这条隐式链接,在其诞生之时就已确定:

  • 字面量对象(比如 {})的原型,自然是 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 再进行比较的方式,isPrototypeOf() 显然更简洁,也更符合语义。这算是原型操作中一个非常实用的小技巧了。

来源:https://www.php.cn/faq/2330976.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
Vue应用中异步更新性能问题的优化策略详解

Vue应用中异步更新性能问题的优化策略详解

先来看一个令许多开发者感到困惑的场景:明明修改了数据,DOM 却“毫无反应”,无法获取最新的高度,也无法计算正确的坐标。这并非 Vue 的缺陷,反而是它精心设计的性能优化策略。核心在于——你需要学会与它“异步更新”的特性协作,而非硬碰硬。 所谓的“异步更新性能问题”,本质上是一种认知偏差。Vue 的

时间:2026-07-03 07:00
如何避免原型对象挂载大体积动态数组内存污染

如何避免原型对象挂载大体积动态数组内存污染

原型链上的大数组:一个隐蔽的内存冲击波 先给个核心判断:直接在原型对象上挂载一个大体积动态数组,这既不是传统意义上的内存“污染”,也不是安全漏洞那种“污染”,而是一种相当隐蔽但后果严重的内存管理失当。它会导致所有实例共享同一份数据,而且正因为生命周期跟整个原型链绑定得太紧,垃圾回收器(GC)根本看不

时间:2026-07-03 07:00
利用堆栈信息精准定位显式绑定错误对象致未定义异常

利用堆栈信息精准定位显式绑定错误对象致未定义异常

深入追踪:显式绑定传错对象引发的未定义异常 说实话,这类问题在JavaScript开发中相当常见——显式绑定传错了对象,然后方法执行时静默失败、访问undefined、或者抛出TypeError。但真正的难点不在于“报了什么错”,而在于“到底是哪个对象被绑错了”。要解决它,需要跳出堆栈的表层报错信息

时间:2026-07-03 07:00
ES模块中默认导出和具名导出的执行上下文

ES模块中默认导出和具名导出的执行上下文

export default 与具名导出在 ES Module 中的行为机制截然不同,核心差异不在于“值如何传递”,而在于绑定如何建立以及导入时如何使用。先给出总结性结论,再逐一详细拆解。 export default 是一种语法糖,而非真正的变量声明 这种设计容易引起误解。实际上,export d

时间:2026-07-03 07:00
详解HTML中iframe标签loading=lazy属性实现嵌入内容懒加载方法

详解HTML中iframe标签loading=lazy属性实现嵌入内容懒加载方法

先聊聊 loading= "lazy " 这个属性——它本意是让 iframe 实现延迟加载,但实际落地时常常“失效”。这并非程序漏洞,而是浏览器内置的防御机制:只有所有条件同时触发,它才会真正推迟资源请求。比如 src 必须是跨域地址(类似 https: widget example com emb

时间:2026-07-03 06:59
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜