Skip to content

混合模式(Mixin)

mixin是一个对象,我们可以使用它向另一个对象或类添加可重用的功能,而无需使用继承。我们不能单独使用 mixin:它们的唯一目的是在没有继承的情况下向对象或类添加功能

假设对于我们的应用程序,我们需要创建多只狗。然而,我们创建的基本狗除了name属性外没有任何属性。

typescript
class Dog {
  constructor(name) {
    this.name = name;
  }
}

狗应该能够做的不仅仅是有名字。它应该能够吠叫、摇尾巴和玩耍!我们可以创建一个 mixin 来为我们提供barkwagTailplay属性,而不是直接将其添加到Dog中。

typescript
const dogFunctionality = {
  bark: () => console.log("Woof!"),
  wagTail: () => console.log("Wagging my tail!"),
  play: () => console.log("Playing!"),
};

我们可以使用Object.assign方法将dogFunctionality mixin 添加到Dog原型中。此方法允许我们向目标对象添加属性:在本例中Dog.prototypeDog的每个新实例都可以访问dogFunctionality的属性,因为它们被添加到Dog的原型中!

typescript
Object.assign(Dog.prototype, dogFunctionality);

让我们创建我们的第一个宠物pet1 ,名为 Daisy。由于我们刚刚将dogFunctionality mixin添加到Dog的原型中,Daisy应该能够走路、摇尾巴和玩耍!

typescript
const pet1 = new Dog("Daisy") as any;

pet1.name; // Daisy
pet1.bark(); // Woof!
pet1.play(); // Playing!

Mixins 使我们可以轻松地向类或对象添加自定义功能,而无需使用继承。

虽然我们可以使用 mixins 添加功能而无需继承,但 mixins 本身可以使用继承!

让我们创建一个animalFunctionality mixin,添加walksleep属性。

typescript
const animalFunctionality = {
  walk: () => console.log("Walking!"),
  sleep: () => console.log("Sleeping!"),
};

我们可以使用Object.assign将这些属性添加到dogFunctionality原型中。在本例中,目标对象是dogFunctionality

typescript
const dogFunctionality = {
  bark: () => console.log("Woof!"),
  wagTail: () => console.log("Wagging my tail!"),
  play: () => console.log("Playing!"),
  walk() {
    super.walk();
  },
  sleep() {
    super.sleep();
  },
};

Object.assign(dogFunctionality, animalFunctionality);

现在,Dog的任何新实例现在也可以访问walksleep方法。