Object.getPrototypeOf() 语法
Object.getPrototypeOf() 是 JavaScript 的一个静态方法,它用于获取某个实例对象的原型。
在 ES5 之前,我们可以通过 obj.__proto__ 属性(非标准,但广泛支持)来访问原型,但这种其实是非标准的方式。在 ES5 之后,强烈推荐使用 Object.getPrototypeOf() 来获取对象原型链,这也是官方推荐的方式。
语法:
Object.getPrototypeOf(obj)说明:
Object.getPrototypeOf() 方法接收单个参数。
obj(必选):是一个实例对象。
Object.getPrototypeOf() 方法会返回指定对象的原型对象。
- 如果 obj 是 Object.prototype 本身,或者是一个通过 Object.create() 创建的 “纯粹” 对象(即 Object.create(null)),则 Object.getPrototypeOf() 返回 null。
- 如果 obj 不是一个对象,在 ES6+(现代浏览器)中,如果参数是基本类型(如 String、Number、Boolean),会先强制转换为对象。当参数是 null 或 undefined 时,则会抛出 TypeError 异常。”
注意:
- getPrototypeOf() 方法是一个静态方法,它只能被类名(即 Object)调用,而无法被实例调用。
- Object.getPrototypeOf() 是获取 “实例对象” 的原型,而不是获取 “构造函数” 的原型,这一点小伙伴们要严格区分。
- getPrototypeOf() 用于获取原型,而 setPrototypeOf() 用于设置原型。
Object.getPrototypeOf() 摘要
| 属于 | JavaScript Object 对象 |
|---|---|
| 使用频率 | 中 |
| 官方文档 | 查看 |
| MDN | 查看 |
Object.getPrototypeOf() 示例
接下来,我们通过几个简单的例子来讲解一下 Object.getPrototypeOf() 方法是如何使用的。
示例 1:Object.getPrototypeOf() 与 __proto__ 的区别
function F(){}
const f = new F();
const result = Object.getPrototypeOf(f) === f.__proto__;
console.log(result);运行结果如下。
true分析:
在这个例子中,我们定义了一个构造函数 F(),然后使用 new F() 实例化了一个对象 f。F 是一个构造函数,而 f 是一个实例对象。
想要获取实例对象的原型,除了使用 ES5 的 Object.getPrototypeOf(),我们还可以使用 ES5 之前的 __proto__ 来实现。但是现在官方已经舍弃 __proto__ 这种方式了,所以也不再建议小伙伴们继续使用。
示例 2:Object.getPrototypeOf() 与 prototype 的区别
function F(){}
const f = new F();
const result = Object.getPrototypeOf(f) === F.prototype;
console.log(result);运行结果如下。
true分析:
我们应该知道,构造函数的 prototype 属性指向的就是原型对象。其中,prototype 属性只能用于构造函数上,而不能用于实例对象上。如果想要获取实例对象的原型时,就不能使用 “xxx.prototype” 的方式了,而是应该使用 “Object.getPrototypeOf(xxx)” 来实现。
