--- id: 587d7db2367417b2b2512b89 challengeType: 1 forumTopicId: 301331 localeTitle: 使用 Mixin 在不相关对象之间添加共同行为 --- ## Description
正如你所见,行为是可以通过继承来共享的。然而,在有些情况下,继承不是最好的解决方案。继承不适用于不相关的对象,比如BirdAirplane。虽然它们都可以飞行,但是Bird并不是一种Airplane,反之亦然。 对于不相关的对象,更好的方法是使用mixinsmixin允许其他对象使用函数集合。 ```js let flyMixin = function(obj) { obj.fly = function() { console.log("Flying, wooosh!"); } }; ``` flyMixin能接受任何对象,并为其提供fly方法。 ```js let bird = { name: "Donald", numLegs: 2 }; let plane = { model: "777", numPassengers: 524 }; flyMixin(bird); flyMixin(plane); ``` 这里的flyMixin接收了birdplane对象,然后将fly方法分配给了每一个对象。现在birdplane都可以飞行了: ```js bird.fly(); // prints "Flying, wooosh!" plane.fly(); // prints "Flying, wooosh!" ``` 注意观察mixin是如何允许相同的fly方法被不相关的对象birdplane重用的。
## Instructions
创建一个名为glideMixinmixin,并定义一个glide方法。然后使用glideMixin来给birdboat赋予滑行(glide)的能力。
## Tests
```yml tests: - text: 你应该声明一个变量名为glideMixin的函数。 testString: assert(typeof glideMixin === "function"); - text: 你应该在bird上使用glideMixin,以提供glide方法。 testString: assert(typeof bird.glide === "function"); - text: 你应该在boat上使用glideMixin,以提供glide方法。 testString: assert(typeof boat.glide === "function"); ```
## Challenge Seed
```js let bird = { name: "Donald", numLegs: 2 }; let boat = { name: "Warrior", type: "race-boat" }; // Add your code below this line ```
## Solution
```js let bird = { name: "Donald", numLegs: 2 }; let boat = { name: "Warrior", type: "race-boat" }; function glideMixin (obj) { obj.glide = () => 'Gliding!'; } glideMixin(bird); glideMixin(boat); ```