Страницы

Поиск по вопросам

вторник, 9 октября 2018 г.

В чем отличия метода от функции?

Хотелось бы узнать о различиях между методом ({method(){}}) и функцией ({function: function(){}}) - как по смыслу, так и технически. Желательно не выдержку из спеки (в конце можно и её), а более человеческим языком.
Как частный вопрос: почему метод не получается использовать в роли конструктора?
function f(){} let obj = { f(){} }; console.info(new f()); // {} console.info(new obj.f()); // TypeError: obj.f is not a constructor


Ответ

Разница между "методом" и "функцией" в JS исключительно в синтаксисе. Аналогично с "классом" и "прототипом".
Просто к ES6 разрабы языка решили окончательно признать, что прототипы никому даром не нужны ни под каким соусом (расширения стандартных классов сообщество объявило вселенским злом, а выкрутасы с прототипами мимо классического ООПа напрочь убивают хитроумные оптимизации во всех жабоскриптовых движках), поэтому следующее поколение жабоскриптеров может писать "классы", "методы", "конструкторы", а про прототипы вспоминать на лекциях "продвинутый жабоскрипт, или, мама, я еду без рук!"

Вопсче, традиционно считается, что функция — это нечто, что существует отдельно от всего, принимает параметры и возвращает результат; метод — это нечто, что прибито гвоздями к конкретному объекту, на деле принимает объект первым аргументом явно или неявно, а так от функции мало отличается; и всякие Вирты ещё отделяют процедуры, которые что-то делают, временами что-то принимают, но ничего не возвращают.
В мире жабоскрипта этого всего не существует: this есть везде, глобальные функции являются методами глобального объекта (в браузерах window), функции всегда что-то возвращают (если ничего не вернуть явно, undefined вернут за вас). В других языках стройное разделение портят статические глобальные методы, методы-расширения и прочее, что помножает всякую классификацию на ноль.
Внутри все эту функции-методы-процедуры выглядят абсолютно одинаково: пушнули позицию, джампнулись, что-то сделали, попнули, вернулись.

Комментариев нет:

Отправить комментарий