#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. Например конструктор это процедура. (не во всех языках, но во многих оно не возвращает значение)
Комментариев нет:
Отправить комментарий