JavaScript Object.setPrototypeOf() 方法

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()),在某些特定场景下(例如作为纯粹的数据字典)非常有用。

上一篇: Object.assign()

下一篇: Object.prototype.toString()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号