Що таке перекриття в JavaScript?

Щоб зрозуміти поняття переопределення в JavaScript, давайте спочатку переглянемо концепцію переосмислення як цілого.

Метод Overriding - це концепція OOP, тісно пов'язана із спадщиною. Коли метод дочірнього класу перевизначає однойменний метод батьківського класу, параметри та тип повернення, його називають методом переопределення. Також нагадаємо, що це абсолютно відрізняється від концепції перевантаження методом. Перевантаження методу відбувається, коли є дві функції з однаковою назвою, але різними параметрами.

Тепер спробуємо зрозуміти це поняття з точки зору JavaScript. Ми знаємо, що JavaScript "відносно" не орієнтований на об'єкти. У нього є поняття «Об’єкти», яке кваліфікує її як об’єктно-орієнтовану, але не має поняття Класи. Він має прототиповий характер. Так, я чую, як ви голосно кричали про те, що ми можемо оголошувати класи в JavaScript, але нагадаю, що це позначення класу є лише синтаксичним цукром основної прототипічної архітектури.

Отже, JavaScript підтримує концепцію перекриття методу. І це робить дуже дивними способами. Зрештою, це найбільш неправильно зрозуміла мова у світі програмування. JavaScript підтримує переосмислення, але не перевантажуючи.

Примітка. У прикладах цієї статті ми використовували б консоль розробника браузерів. Просто відкрийте інструменти для розробників браузера (Ctrl / Cmd + Shift + C) та перейдіть на вкладку Консоль у вікні інструментів для розробників.

Виглядає так у Chrome:

Це майданчик для більшості концепцій, що стосуються JavaScript. Ми будемо використовувати цю майданчик у цій статті.

Як переосмислення працює в JavaScript?

У JavaScript всі об'єкти успадковуються від прототипу Object. Усі об'єкти є екземплярами Object. Таким чином, щоразу, коли ви створюєте будь-який новий об'єкт, JavaScript автоматично визначає властивість _proto_ (прототип) для нового об’єкта. Коли створюється дочірній об’єкт, він знову має властивість _proto_ тощо. Тепер, коли ви намагаєтеся отримати доступ до методу чи властивості об'єкта, JavaScript спочатку перевіряє, чи є в об'єкта цей метод / властивість. Якщо цього немає, JavaScript перевіряє, чи має _proto_ об'єкт цей метод / властивість. Якщо ні, JavaScript перевіряє, чи має _proto_ батьківського об'єкта цей метод / властивість. Він продовжує пошук по ланцюгу до тих пір, поки не буде знайдено або метод / властивість або не буде знайдено і не шукано _proto_ з Object. Наприклад, Date.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) Перша поведінка

Перший спосіб - це той, який ми бачили вище, коли ми визначали метод переосмислення конструктора дат за замовчуванням JavaScript. Це схоже на третій спосіб, проілюстрований нижче, оскільки всі об'єкти в JavaScript є екземпляром прототипу Object. Що відрізняє третю поведінку, це використання ключового слова супер. Ми побачимо більше, коли проілюструємо третю поведінку.

Подивимось ще один подібний приклад. Цього разу ми б замінили функцію оповіщення. Типова поведінка функції оповіщення в 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. Коли дочірній клас успадковує методи батьківського класу та визначає власні методи з тим самим іменем, методи батьківського класу переосмислюються. Це не те, що ми б хотіли в реальному застосуванні. Ми хотіли б, щоб наші методи батьківського класу були доступними навіть тоді, коли їх переважають дочірні методи класу. Отже, нам на допомогу приходить супер ключове слово. Використовуючи ключове слово супер, ми можемо отримати доступ до методів батьківського класу.

Давайте побачимо це в дії.

//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();

Тепер поверніться до першого прикладу поведінки та спробуйте використати там ключове слово супер. Ви помітили, що це не працює. Це тому, що коли ми створили наш метод у першому прикладі, ми не розширили батьківський клас. Ми створили метод у глобальному масштабі, тим самим перекривши всі інші визначення методу.

Висновок

Давайте переглянемо наше розуміння методу, що перекриває JavaScript. Ми дізналися, що JavaScript підтримує переосмислення, але не перевантажуючи. Якщо ми спробуємо перевантажити методи, JavaScript переосмислює всі попередні визначення на останнє. Це справедливо навіть для основних функцій!

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

Рекомендовані статті

Це посібник із переосмислення JavaScript. Тут ми обговорюємо, як працює переосмислення в JavaScript та типи переопределення в JavaScript. Ви також можете переглянути наступну статтю, щоб дізнатися більше -

  1. Що Javascript може зробити?
  2. Що таке JavaScript?
  3. Як встановити JavaScript
  4. Python Frameworks - що таке фреймворк пітона?
  5. Вступ до перекриття в C ++
  6. Вступ до переосмислення OOPs
  7. Перевагу в Java
  8. Спосіб перевантаження в C #
  9. Перевантаження і перезавантаження в C #