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

在Ja vaScript的世界里,要获取一个对象的原型,最直接、最规范的方法就是调用 Object.getPrototypeOf()。不过,要真正理解它的价值,还得从Ja vaScript那套独特的原型链机制说起——每个对象内部都有一个隐式的 [[Prototype]] 链接,它就像一条看不见的线,指向了其构造函数的 prototype 对象。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
这个方法的设计初衷,就是返回指定对象内部那个 [[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
原型链这个概念,可以说是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(obj) 获取的是对象实例的原型,而 obj.constructor.prototype 则是试图通过对象的构造函数属性来反推原型。后者听起来合理,但实际上并不可靠,原因有三:
constructor 属性被修改过(比如在重写 prototype 时没有同步更新 constructor 指向),结果就会出错。prototype 属性,因此通过 obj.constructor.prototype 访问会出问题。Object.create(null) 创建的对象,压根就没有 constructor 这个属性。所以,结论很明确:始终优先使用 Object.getPrototypeOf()。它是获取对象原型唯一规范且健壮的途径。
有时候,我们不仅仅是想获取原型,还想判断某个对象是否存在于另一个对象的原型链上。这时,使用 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() 显然更简洁,也更符合语义。这算是原型操作中一个非常实用的小技巧了。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述