3

В недавнем интервью JavaScript меня спросили о перегрузке и переопределении. Я знаю, что это понятие в Java:перегрузка и переопределение в javascript

https://softwareengineering.stackexchange.com/questions/164353/whats-the-difference-between-overloading-a-method-and-overriding-it-in-java

Но есть что-то похожее на JavaScript, и если это так, что бы примеры кода? Я понимаю, что перегрузка не распространена в javascript. Зачем вам нужно использовать «перегрузку» в JS?

OverRiding немного яснее для меня - пример более верховой езды был бы в подклассе, где вы наследуете от суперкласса, но над верхом некоторых методов/свойств для создания уникальных для подкласса.

+0

Перегрузка не существует в JavaScript так же, как и другие языки. Что конкретно вы спросили? –

+0

В основном объяснить разницу. в компании, которая переходит с Java на NodeJS – devdropper87

+4

Не подходите к вопросу с классической точки зрения ООП разработчика Java. Javascript - это не ООП так же, как Java, это прототипное наследование. –

ответ

7

JavaScript не поддерживает перегрузку.

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

далее здесь http://blog.mastykarz.nl/overloading-functions-javascript/

+0

Хм это неправда. Javascript не обрабатывает его «каноническим» способом, но есть много шаблонов для обработки перегрузки в javascript. Как хороший javascript-программист, важно иметь дело с ними. – Maksim

+0

@ Maksim Я уверен, что JS не поддерживает перегрузку. И в JS ваша функция - это просто еще один объект, поэтому переменная является просто ссылкой на этот объект, когда вы переназначаете эту переменную, ссылка на эту переменную теряется и объект GCed .. И новый вид функции заменяет, но не переопределяет фактический. В переопределении ссылки на обе функции должны существовать только области, которые различаются – Minato

+0

Я сказал, что нет перегрузки, но есть некоторые шаблоны, чтобы иметь что-то подобное в функциональность. Давайте скажем шаблон опций. И, конечно, функция - это объект, а javascript не «отслеживает» функции с использованием подписи, а просто имя var. Перегрузка - это просто способ обработки различных типов arity или типов данных, которые передаются функции. Итак, да, в javascript есть Перегрузка, но это делается с использованием шаблонов, а не родных на языке. – Maksim

3

Там хороший пример «подделка» JavaScript функция перегрузки здесь: https://stackoverflow.com/a/457589/2754135

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

На самом деле это не перегрузка, потому что это невозможно в JavaScript.

1

Хотя JavaScript не поддерживает перегрузку в традиционном смысле,

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

3

нет необходимости в традиционной концепции перегрузки в javascript из-за ее динамичной природы. На более традиционных языках программирования, как Java, вы можете несколько раз определить метод с разными сигнатурами, и язык будет правильно использовать метод, который вы хотите вызвать, просто используя подпись: thats overload of methods. С другой стороны, переопределение - это возможность переопределить метод родительского класса в дочернем классе. Для перегрузки в javascript обычно используется последний параметр, который называется параметрами. Например

function yourFunction(firstParam, secondParam, options) {};

вариантов просто объекты JavaScript, которые имеют реквизит вы хотите передать. Затем вы можете использовать шаблон так называемых «опций», чтобы проверить наличие реквизита. Чтобы сделать переопределение, это сложнее в чистом javascript из-за прототипности языка: когда вы «расширяете» базовый объект новым, вы можете использовать функцию .call() объекта-конструктора, передающую это, чтобы украсить вновь созданный объект с родительскими реквизитами.