如何用原型链与 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() 显然更简洁,也更符合语义。这算是原型操作中一个非常实用的小技巧了。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
Less如何提升CSS维护性_使用参数化Mixin实现灵活组件
Less参数化Mixin:如何写出既灵活又可控的样式代码? Less参数化Mixin怎么写才不重复造轮子 开门见山,参数化Mixin的核心目标不是炫技,而是解决一个实际问题:把那些“可能会变”的样式值抽离出来。这样一来,样式规则只需定义一次,修改时就能全局生效,维护效率自然就上去了。关键在于,你得准
Vue 中的 Patch 过程是怎么工作的?从 VNode 到真实 DOM 的转化全指南
Vue 中的 Patch 过程是怎么工作的?从 VNode 到真实 DOM 的转化全指南 Patch 的核心目标:高效更新 DOM 简单来说,Vue 的 Patch 过程干的就是一件“聪明事”:它拿着新旧两份虚拟节点(VNode)清单,只去更新真实 DOM 里真正变了的那部分,而不是不管三七二十一,
CSS如何实现移动端加载占位骨架屏_利用CSS渐变色与动画效果
CSS如何实现移动端加载占位骨架屏:利用渐变色与动画效果 先明确一个核心概念:一个真正好用的骨架屏,本质上不是图片,而是用CSS背景渐变“画”出来的容器轮廓。关键在于,如何让background-image精准覆盖真实内容区域,同时巧妙地利用透明间隙来模拟文字或头像的留白。这听起来简单,但实际操作时
CSS如何实现侧边栏推拽切换_利用CSS动画平滑过渡布局
侧边栏推拽用 transform: translateX() 更流畅,避免 left margin-left 触发重排;初始隐藏用 translateX(-100%),配合 ease-out 或自定义 cubic-bezier 过渡更自然;移动端需谨慎 preventDefault() 并启用 -w
Ionic 7 中在 Tab 内实现页面内导航的完整教程
Ionic 7 中在 Tab 内实现页面内导航的完整教程 本文详解如何在 Ionic 7(Vanilla JS)中为单个 Tab 配置独立的嵌套路由系统,解决 ion-router 在 ion-tab 内无法正常跳转的问题,并提供可运行的结构化实现方案。 如果你正在用 Ionic 7 的纯 Ja v
- 日榜
- 周榜
- 月榜
1
2
3
4
5
6
7
8
9
10
相关攻略
2015-03-10 11:25
2015-03-10 11:05
2021-08-04 13:30
2015-03-10 11:22
2015-03-10 12:39
2022-05-16 18:57
2025-05-23 13:43
2025-05-23 14:01
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
热门话题

