首页 > 网页制作 >如何用原型链与 Object.getPrototypeOf 获取对象原型

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

来源:互联网 2026-04-23 19:58:02

如何用原型链与 Object.getPrototypeOf 获取对象原型 在Ja vaScript的世界里,要获取一个对象的原型,最直接、最规范的方法就是调用 Object.getPrototypeOf()。不过,要真正理解它的价值,还得从Ja vaScript那套独特的原型链机制说起——每个对象内

如何用原型链与 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() 显然更简洁,也更符合语义。这算是原型操作中一个非常实用的小技巧了。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。