Страницы

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

воскресенье, 1 декабря 2019 г.

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

#javascript #ecmascript_6


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

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



function f(){}
let obj = {
  f(){}
};

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



    


Ответы

Ответ 1



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

Ответ 2



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

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

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