46 lines
993 B
Markdown
46 lines
993 B
Markdown
Here's the line with the error:
|
|
|
|
```js
|
|
Rabbit.prototype = Animal.prototype;
|
|
```
|
|
|
|
Here `Rabbit.prototype` and `Animal.prototype` become the same object. So methods of both classes become mixed in that object.
|
|
|
|
As a result, `Rabbit.prototype.walk` overwrites `Animal.prototype.walk`, so all animals start to bounce:
|
|
|
|
```js run
|
|
function Animal(name) {
|
|
this.name = name;
|
|
}
|
|
|
|
Animal.prototype.walk = function() {
|
|
alert(this.name + ' walks');
|
|
};
|
|
|
|
function Rabbit(name) {
|
|
this.name = name;
|
|
}
|
|
|
|
*!*
|
|
Rabbit.prototype = Animal.prototype;
|
|
*/!*
|
|
|
|
Rabbit.prototype.walk = function() {
|
|
alert(this.name + " bounces!");
|
|
};
|
|
|
|
*!*
|
|
let animal = new Animal("pig");
|
|
animal.walk(); // pig bounces!
|
|
*/!*
|
|
```
|
|
|
|
The correct variant would be:
|
|
|
|
```js
|
|
Rabbit.prototype.__proto__ = Animal.prototype;
|
|
// or like this:
|
|
Rabbit.prototype = Object.create(Animal.prototype);
|
|
```
|
|
|
|
That makes prototypes separate, each of them stores methods of the corresponding class, but `Rabbit.prototype` inherits from `Animal.prototype`.
|