> Что происходит при вызове методов объекта, объявленных разными способами в JavaScript (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Точка, Soft_Media_Group

Стек: JavaScript

> Пример ответа

При вызове методов объекта в JavaScript ключевое различие определяется способом их объявления, так как это влияет на контекст this и возможность переопределения.

  1. Метод, объявленный через функциональное выражение (function expression):

    JAVASCRIPT
    const obj = {
    method: function() { console.log(this); }
    };
    obj.method(); // this указывает на obj

    При вызове через точку this ссылается на объект, которому принадлежит метод. Если передать метод как callback (например, в setTimeout), контекст теряется.

  2. Стрелочная функция (arrow function):

    JAVASCRIPT
    const obj = {
    method: () => { console.log(this); }
    };
    obj.method(); // this берется из внешнего лексического окружения (например, window или undefined в strict mode)

    Стрелочные функции не имеют собственного this - он наследуется из области видимости, где объект был создан. Поэтому при вызове через точку this не указывает на объект.

  3. Сокращенная запись метода (method shorthand):

    JAVASCRIPT
    const obj = {
    method() { console.log(this); }
    };
    obj.method(); // this указывает на obj

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

  4. Метод, добавленный через прототип (prototype):

    JAVASCRIPT
    function MyClass() {}
    MyClass.prototype.method = function() { console.log(this); };
    const obj = new MyClass();
    obj.method(); // this указывает на экземпляр obj

    При вызове на экземпляре this ссылается на этот экземпляр.

Ключевые отличия:

  • Контекст this: стрелочные функции фиксируют this при объявлении, остальные - при вызове.

  • Переопределение: методы, объявленные через function или shorthand, можно переопределить в подклассах; стрелочные функции - нет, так как они не привязаны к прототипу.

  • Использование как конструктора: только функции, объявленные через function, могут быть вызваны с new; стрелочные и shorthand - нет.

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

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью