Перезапись метода (Method overriding) в JavaScript

2

Method Overriding

function extend(Child, Parent) {
    Child.prototype = Object.create(Parent.prototype);
    Child.prototype.constructor = Child;
}

function Shape() {
}

Shape.prototype.duplicate = function () {
    console.log('duplicate');
}

function Circle) {
}

extend(Circle, Shape);

const c = new Circle();

Иногда, когда Вы работаете с наследованием, вы можете встретить ситуацию, когда эта реализация, которую вы определили в родительском объекте, не работает или работает не так как надо в дочернем объекте.

Давайте представим, что этот алгоритм для дублирования фигур работает для большинства shape объектов. Но возможно оно должно иметь другое поведение для circle объектов.

И что же нам делать?

Будем использовать method override перезапись метода.

Мы переназначим метод, который указан в родительском объекте. Всё что нам нужно сделать, это переопределить метод duplicate в объекте circle.

Circle.prototype.duplicate = function () {
    console.log('duplicate circle');
}

Это очень важно, указать эту функцию после того как мы переопределили прототип с помощью функции extend.

Если мы определим функцию до того как переопределили прототип, реализация нашей функции исчезнет.

Причина, почему перезапись метода работает в том, как работает прототипное наследование в JavaScript. Когда мы обращаемся к свойству или методу, движок JS идёт вверх по прототипной цепочке и берет первую реализацию, которую встречает на своем пути.

Т.е. даже если метод имплементирован и у родителя и у дочернего объекта, имплементация дочернего объекта будет использована.

Теперь когда вы захотите вызвать имплементацию родительского метода в методе дочернего объекта, то сделать это будет довольно таки легко.

Circle.prototype.duplicate = function() {
    Shape.prototype.duplicate.call(this);
    console.log('duplicate circle');
}

Теперь вызовет и метод родителя и свой метод.

You might also like More from author

Leave A Reply

Your email address will not be published.