--- id: 587d7db1367417b2b2512b88 challengeType: 1 forumTopicId: 301322 title: 重写继承的方法 --- ## Description
在上一个挑战中,我们学习了一个对象可以通过复制另一个对象的原型来继承其属性和行为(或方法): ```js ChildObject.prototype = Object.create(ParentObject.prototype); ``` 然后,ChildObject将自己的方法链接到它的原型中: ```js ChildObject.prototype.methodName = function() {...}; ``` 我们还可以重写继承的方法。以同样的方式——通过使用一个与需要重写的方法相同的方法名,向ChildObject.prototype中添加方法。 请看下面的举例:Bird重写了从Animal继承来的eat()方法: ```js function Animal() { } Animal.prototype.eat = function() { return "nom nom nom"; }; function Bird() { } // 继承了 Animal 的所有方法 Bird.prototype = Object.create(Animal.prototype); // Bird.eat() 重写了 Animal.eat() 方法 Bird.prototype.eat = function() { return "peck peck peck"; }; ``` 如果你有一个实例:let duck = new Bird();,然后你调用了duck.eat(),以下就是 JavaScript 在duck原型链上寻找方法的过程: 1. duck => 这里定义了 eat() 方法吗?没有。 2. Bird => 这里定义了 eat() 方法吗?=> 是的。执行它并停止往上搜索。 3. Animal => 这里也定义了 eat() 方法,但是 JavaScript 在到达这层原型链之前已停止了搜索。 4. Object => JavaScript 在到达这层原型链之前也已经停止了搜索。
## Instructions
重写Penguinfly()方法,使其返回 "Alas, this is a flightless bird."
## Tests
```yml tests: - text: "penguin.fly()方法应该返回字符串:'Alas, this is a flightless bird.'" testString: assert(penguin.fly() === "Alas, this is a flightless bird."); - text: "The bird.fly()方法应该返回 'I am flying!'" testString: assert((new Bird()).fly() === "I am flying!"); ```
## Challenge Seed
```js function Bird() { } Bird.prototype.fly = function() { return "I am flying!"; }; function Penguin() { } Penguin.prototype = Object.create(Bird.prototype); Penguin.prototype.constructor = Penguin; // Add your code below this line // Add your code above this line let penguin = new Penguin(); console.log(penguin.fly()); ```
## Solution
```js function Bird() { } Bird.prototype.fly = function() { return "I am flying!"; }; function Penguin() { } Penguin.prototype = Object.create(Bird.prototype); Penguin.prototype.constructor = Penguin; Penguin.prototype.fly = () => 'Alas, this is a flightless bird.'; let penguin = new Penguin(); console.log(penguin.fly()); ```