跳到主要内容

Javascript 对象 setPrototypeOf() 方法

Object.setPrototypeOf() 方法将指定对象的原型设置为另一个对象或 null

示例

// 创建一个空对象
const obj = {};

// 创建一个非空的对象 parent
const parent = { foo: "bar" };

// 将 parent 设置为 obj 的原型
Object.setPrototypeOf(obj, parent);

// 使用 obj 对象打印 parent 的 foo 属性
console.log(obj.foo);

// 输出:"bar"

setPrototypeOf() 语法

setPrototypeOf() 方法的语法为:

Object.setPrototypeOf(obj, prototype);

作为静态方法的 setPrototypeOf(),需要使用 Object 类名来调用。

setPrototypeOf() 参数

setPrototypeOf() 方法接受以下参数:

  • obj - 我们想要设置原型的对象。
  • prototype - 对象的新原型(一个对象或 null)。

setPrototypeOf() 返回值

setPrototypeOf() 方法返回我们想要设置原型的对象,即 obj。

注意: 在每个浏览器和 JavaScript 引擎中,改变对象的 [[Prototype]] 当前都是一个非常慢的操作。

示例 1:JavaScript Object.setPrototypeOf()

// 创建要设置为原型的对象
let Animal = {
makeSound() {
console.log(`${this.name}, ${this.sound}!`);
},
};

// 定义 Dog 对象的构造函数
function Dog(name) {
this.name = name;
this.sound = "bark";

// 将 Dog 对象的原型设置为 Animal
Object.setPrototypeOf(this, Animal);
}

// 使用 Dog() 构造函数创建 dog1 对象
dog1 = new Dog("Marcus");

// 调用 Animal 的 makeSound() 方法
dog1.makeSound();

// 输出:Marcus, bark!

在上述示例中,使用 Object.setPrototypeOf() 方法将 Animal 对象设置为 dog1 对象的原型。

因此,我们可以使用 dog1 对象访问 Animal 的 makeSound() 方法,即使它没有在 Dog() 构造函数内定义。

示例 2:在类中使用 setPrototypeOf()

// 创建要设置为原型的对象
let Animal = {
makeSound() {
console.log(`${this.name}, ${this.sound}!`);
},
};

// 创建 Dog 类
class Dog {
constructor(name) {
this.name = name;
this.sound = "bark";
}
}

// Dog 是一个类,所以
// Dog.prototype 是一个对象
Object.setPrototypeOf(Dog.prototype, Animal);

// 创建 Dog 类的一个对象
let dog1 = new Dog("Marcus");

// 打印 dog1 的属性
console.log(dog1);

// 输出:{ name: 'Marcus', sound: 'bark' }

// 调用 Animal 的 makeSound() 方法
dog1.makeSound();

// 输出:Marcus, bark!

在上述示例中,setPrototypeOf() 方法用于将 Dog 类对象的原型设置为 Animal 对象。

结果,Dog 类的所有实例(在我们的例子中是 dog1)都可以继承并调用 Animal 对象的 makeSound() 方法。

推荐阅读: