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

476
03 октября 2017, 07:27

Хотелось бы узнать о различиях между методом ({method(){}}) и функцией ({function: function(){}}) - как по смыслу, так и технически. Желательно не выдержку из спеки (в конце можно и её), а более человеческим языком.

Как частный вопрос: почему метод не получается использовать в роли конструктора?

function f(){} 
let obj = { 
  f(){} 
}; 
 
console.info(new f());     // {} 
console.info(new obj.f()); // TypeError: obj.f is not a constructor

Answer 1

Разница между "методом" и "функцией" в JS исплючительно в синтаксисе. Аналогично с "классом" и "прототипом".

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

Вопсче, традиционно считается, что функция — это нечто, что существует отдельно от всего, принимает параметры и возвращает результат; метод — это нечто, что прибито гвоздями к конкретному объекту, на деле принимает объект первым аргументом явно или неявно, а так от функции мало отличается; и всякие Вирты ещё отделают процедуры, которые что-то делают, временами что-то принимают, но ничего не возвращают.

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

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

Answer 2
Логически:

метод - это присуще объекту. вызывается только для объекта. может работать с внутренними полями объекта.

функция - вещь в себе вызывается откуда угодно и для чего угодно.

Реально:

метод - такая же функция, одним из входных значений которой является объект, для которого вызван метод.

Проще говоря

  • метод: функция или процедура, принадлежащая классу (ну или объекту).
  • функция: возвращает результат
  • процедура: не возвращает результат т.е отсутствует return. Например конструктор это процедура. (не во всех языках, но во многих оно не возвращает значение)
READ ALSO
JQuery - Переключение блоков при клике на другие блоки

JQuery - Переключение блоков при клике на другие блоки

Есть 2 блока, вверху один активный (имеет класс active), другой нетЕсть 2 других блока ниже, со свойством display:none, но один, как можно догадаться,...

411
Не работает слайдер от яндекса

Не работает слайдер от яндекса

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

256
Как получить значение выбранного input?

Как получить значение выбранного input?

Народ, помогите пожалуйстаДелаю калькулятор стоимости ремонта

265