Что такое переопределение в JavaScript?

Чтобы понять концепцию переопределения в JavaScript, давайте сначала пересмотрим концепцию переопределения в целом.

Переопределение метода - это концепция ООП, тесно связанная с наследованием. Когда метод дочернего класса переопределяет метод родительского класса с тем же именем, параметрами и типом возврата, это называется переопределением метода. Также следует напомнить, что это полностью отличается от концепции перегрузки методов. Перегрузка метода происходит, когда есть две функции с одинаковым именем, но разными параметрами.

Теперь давайте попробуем понять эту концепцию с точки зрения JavaScript. Мы знаем, что JavaScript «относительно» не объектно-ориентирован. У него действительно есть понятие Объектов, которое квалифицирует его как объектно-ориентированное, но у него нет понятия Классов. Это прототип по своей природе. Да, да, я слышал, как вы громко кричали, что мы можем объявить классы в JavaScript, но позвольте мне напомнить вам, что эта запись класса является просто синтаксическим сахаром для базовой прототипической архитектуры.

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

Примечание. В примерах, приведенных в этой статье, мы будем использовать консоль разработчика браузеров. Просто откройте инструменты разработчика браузера (Ctrl / Cmd + Shift + C) и перейдите на вкладку Консоль в окне инструментов разработчика.

В Chrome это выглядит так:

Это площадка для большинства концепций, связанных с JavaScript. Мы будем использовать эту площадку на протяжении всей этой статьи.

Как переопределение работает в JavaScript?

В JavaScript все объекты наследуются от прототипа Object. Все объекты являются экземплярами объекта. Таким образом, всякий раз, когда вы создаете какой-либо новый объект, JavaScript автоматически определяет свойство _proto_ (prototype) для нового объекта. Когда дочерний объект создается, он снова имеет свойство _proto_ и так далее. Теперь, когда вы пытаетесь получить доступ к методу или свойству объекта, JavaScript сначала проверяет, есть ли у объекта этот метод / свойство. Если это не так, JavaScript проверяет, есть ли у объекта _proto_ этот метод / свойство. Если нет, JavaScript проверяет, есть ли у этого родительского объекта _proto_ этот метод / свойство. Он продолжает поиск по цепочке до тех пор, пока либо метод / свойство не будет найдено, либо _proto_ of Object не будет обнаружен и найден. Например, Date.prototype. ((Prototype)) является Object.prototype.

Теперь посмотрите цепочку вверх ногами. Вот как переопределение работает в JavaScript. Метод будет продолжать переопределять метод родительского объекта, даже если это метод Object. Например, мы можем даже переопределить основные функции, такие как создание объекта Date.

Давайте посмотрим на это на примере:

new Date(); //the JavaScript Date() method
//overriding the JavaScript Date() method
function Date()(
this.date = "This method overrides the default constructor of Date class.";
);
var date2 = new Date();
console.log(date2);

Типы переопределения в JavaScript

В JavaScript нет типов переопределения. Однако, основываясь на поведении языка программирования, мы можем сказать, что переопределение метода в JavaScript работает следующими способами.

1) Первое поведение

Первый способ - тот, который мы видели выше, когда мы определили метод для переопределения стандартного конструктора Date в JavaScript. Это похоже на третий способ, показанный ниже, потому что все объекты в JavaScript являются экземпляром прототипа Object. Что отличает третье поведение, так это использование ключевого слова super. Мы увидим больше, когда проиллюстрируем третье поведение.

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

Теперь, когда мы перезаписываем его собственным кодом, функция оповещения по умолчанию больше не вызывается.

function alert(msg) (
console.log(msg);
);
alert("This is an alert.");

2) Второе поведение

Второй способ - когда мы пытаемся перегрузить функции в JavaScript. Помните, JavaScript не поддерживает перегрузку функций. Таким образом, вместо перегрузки вашей функции, JavaScript переопределяет все предыдущие определения вашей функции последними.

Давайте посмотрим на это в действии.

//Calculate area of rectangle
function calculateArea(x, y)(
return x*y;
)
//Calculate area of square
function calculateArea(a)(
return a*a;
)
console.log("Area of rectangle 2x3 is : " + calculateArea(2, 3));
console.log("Area of square 5x5 is : " + calculateArea(5));

Обратите внимание на результат. JavaScript всегда вызывает второе определение функции и возвращает квадрат первого параметра. Последующие параметры игнорируются.

3) Третье поведение

Третье поведение проявляется, когда мы задействуем классы и наследование в JavaScript. Когда дочерний класс наследует методы родительского класса и определяет свои собственные методы с тем же именем, методы родительского класса переопределяются. Это не то, что мы хотели бы в реальных приложениях. Мы бы хотели, чтобы методы родительского класса были доступны даже при переопределении методами дочернего класса. Итак, супер ключевое слово приходит нам на помощь. Используя ключевое слово super, мы можем получить доступ к методам родительского класса.

Давайте посмотрим на это в действии.

//the parent class
class Person (
greet() (
console.log("Hello. I am a person.");
);
)
//the child class
class Employee extends Person (
greet() (
super.greet(); //calling parent class method via keyword 'super'
console.log("Hello. I am an employee.");
)
)
let per = new Person(); //parent class object
let emp = new Employee(); //child class object
per.greet();
emp.greet();

Теперь вернитесь к первому примеру поведения и попробуйте использовать ключевое слово super. Вы бы заметили, что это не работает. Это потому, что когда мы создали наш метод в первом примере, мы не расширили родительский класс. Мы создали метод в глобальной области видимости, переопределяя все остальные определения метода.

Вывод

Давайте пересмотрим наше понимание переопределения метода в JavaScript. Мы узнали, что JavaScript поддерживает переопределение, но не перегрузку. Если мы пытаемся перегрузить методы, JavaScript переопределяет все предыдущие определения самыми последними. Это верно даже для основных функций!

Далее мы увидели, как мы можем переопределять методы в дочерних классах и впоследствии обращаться к методам родительского класса по мере необходимости. Это очень полезная концепция, поскольку она позволяет нам расширять функциональность наших родительских классов и, таким образом, улучшает возможность повторного использования кода.

Рекомендуемые статьи

Это руководство по переопределению в JavaScript. Здесь мы обсудим, как переопределение работает в JavaScript и Типы переопределения в JavaScript. Вы также можете посмотреть следующую статью, чтобы узнать больше -

  1. Что может сделать Javascript?
  2. Что такое JavaScript?
  3. Как установить JavaScript
  4. Python Frameworks - что такое Python Framework?
  5. Введение в переопределение в C ++
  6. Введение в переопределение в ООП
  7. Переопределение в Java
  8. Перегрузка метода в C #
  9. Перегрузка и переопределение в C #