Object.setPrototypeOf() 语法
Object.setPrototypeOf() 是 JavaScript 的一个静态方法,它用于将指定对象的原型设置为另一个对象。
语法:
Object.setPrototypeOf(obj1, obj2)说明:
Object.setPrototypeOf() 方法接收 2 个对象作为参数。Object.setPrototypeOf(obj1, obj2) 表示将 obj1 的原型设置为 obj2。
对于 Object.setPrototypeOf() 方法,小伙伴们要清楚以下几点。
- setPrototypeOf() 用于设置原型,而 getPrototypeOf() 用于获取原型。
- Object.setPrototypeOf() 是改变对象原型链的最理想的方式,它取代了非标准的 __proto__ 属性(尽管 __proto__ 仍然广泛存在且在非严格模式下可用)。
- 在大多数 JavaScript 引擎中,动态地改变一个对象的原型(尤其是在频繁执行的代码中)是非常慢且不推荐的操作。它会破坏 V8 等引擎的内部优化,导致性能下降。比较好的实践是,在对象创建时通过 Object.create() 或类语法来设置原型。
注意: setPrototypeOf() 是一个静态方法,它只能被类名(即 Object)调用,而无法被实例调用。
Object.setPrototypeOf() 摘要
| 属于 | JavaScript Object 对象 |
|---|---|
| 使用频率 | 低 |
| 官方文档 | 查看 |
| MDN | 查看 |
Object.setPrototypeOf() 示例
接下来,我们通过几个简单的例子来讲解一下 Object.setPrototypeOf() 方法是如何使用的。
示例 1:Object.setPrototypeOf() 基本用法
const parent = {
foo: "foo"
};
const child = {};
Object.setPrototypeOf(child, parent);
console.log(child.foo);运行结果如下。
foo注意: 出于性能和可读性的考虑,我们并不建议使用 Object.setPrototypeOf() 来实现继承,而是推荐使用 extends 来实现继承。
示例 2:Object.setPrototypeOf() 将对象的原型设置为 null
const obj = {
id: 123,
value: "abc"
};
// 1. 设置前:检查原型链中是否存在 toString
console.log("toString" in obj);
console.log(obj.toString());
// 2. 将 obj 的原型设置为 null
Object.setPrototypeOf(obj, null);
// 3. 再次检查
console.log("toString" in obj);
// 尝试调用 toString
try {
console.log(obj.toString());
} catch (e) {
console.log(e);
}运行结果如下。
true
[object Object]
false
(报错)TypeError: obj.toString is not a function分析:
将一个对象的原型设置为 null,可以创建一个没有原型链的对象。这样的对象不会继承任何 Object.prototype 上的方法(如 toString()、hasOwnProperty()),在某些特定场景下(例如作为纯粹的数据字典)非常有用。
