> Как сделать функцию вызываемой через точку в JavaScript (JavaScript)

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

Компании: GoInvest

Стек: JavaScript

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

Короткий ответ

Чтобы функция вызывалась через точку, её нужно определить как метод объекта: obj.method(). В JavaScript методы - это свойства объекта, значением которых является функция. При вызове через точку внутри функции this ссылается на объект слева от точки. Для классов используется синтаксис class с методами в теле класса. Также можно добавить метод в прототип: Constructor.prototype.method = function() {}.

Подробное объяснение

В JavaScript функция становится вызываемой через точку, когда она является свойством объекта. Механика простая: доступ к свойству через точку возвращает функцию, затем оператор () вызывает её с контекстом this, равным объекту.

Есть несколько способов создать такой метод:

  1. Литерал объекта - самый простой случай:
JAVASCRIPT
const obj = {
greet() { return 'hello'; }
};
  1. Динамическое добавление - после создания объекта:
JAVASCRIPT
obj.greet = function() { return 'hello'; };
  1. Классы - синтаксический сахар над прототипами:
JAVASCRIPT
class Greeter {
greet() { return 'hello'; }
}
  1. Прототип конструктора - для функций-конструкторов:
JAVASCRIPT
function Greeter() {}
Greeter.prototype.greet = function() { return 'hello'; };

Ключевой момент - this. При вызове obj.method() внутри method значение this - это obj. Это называется implicit binding. Если метод вызывается без объекта (const fn = obj.method; fn()), this будет undefined в strict mode или глобальным объектом без него.

На практике

На собеседовании важно показать понимание не только синтаксиса, но и контекста. Обычно спрашивают про разницу между методами и обычными функциями, про потерю контекста при деструктуризации, про bind, call, apply.

Также стоит упомянуть, что методы в классах не создаются заново для каждого экземпляра - они живут в прототипе. Это важно для производительности.

Если речь про цепочки вызовов (obj.method1().method2()), то каждый метод должен возвращать объект, на котором вызывается следующий метод.

Пример кода

JAVASCRIPT
// Базовый случай
const user = {
name: 'Alice',
getName() {
return this.name;
}
};
console.log(user.getName()); // 'Alice'
// Потеря контекста
const detached = user.getName;
console.log(detached()); // TypeError или undefined
// Исправление через bind
const bound = user.getName.bind(user);
console.log(bound()); // 'Alice'
// Класс
class Counter {
constructor() {
this.count = 0;
}
increment() {
this.count++;
return this; // для цепочек
}
getValue() {
return this.count;
}
}
const c = new Counter();
c.increment().increment();
console.log(c.getValue()); // 2
// Добавление метода в прототип
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
return `${this.name} makes a sound`;
};
const dog = new Animal('Rex');
console.log(dog.speak()); // 'Rex makes a sound'

Как отвечать на собеседовании

Начни с базового определения: метод - это функция-свойство объекта. Затем покажи разные способы создания. Обязательно упомяни this и его поведение. Если уровень senior - добавь про потерю контекста, bind, стрелочные функции (у них нет своего this), про прототипное наследование.

Хорошо показать понимание, что obj.method() - это синтаксический сахар над obj.method.call(obj). Можно упомянуть, что в современном JS методы в классах не перечисляемы (non-enumerable), в отличие от свойств, добавленных через присваивание.

Что проверяет интервьюер

Интервьюер хочет убедиться, что кандидат:

  • понимает, что методы - это свойства объекта;
  • знает, как работает this в контексте вызова;
  • различает способы создания методов (литерал, класс, прототип);
  • осознаёт проблему потери контекста и умеет её решать;
  • понимает разницу между обычной функцией и методом.

Для senior важно показать понимание внутренних механизмов: как JavaScript резолвит свойство через прототипную цепочку, как this привязывается в момент вызова, а не определения.

Типичные ошибки

  • Утверждение, что методы в классах создаются для каждого экземпляра - это не так, они в прототипе.
  • Игнорирование потери контекста при передаче метода как callback.
  • Использование стрелочных функций как методов - у них нет своего this, поэтому this будет лексическим, а не объектом.
  • Путаница между obj.method() и obj.method - второе просто возвращает функцию без вызова.
  • Забывают, что this в методах зависит от того, как вызвана функция, а не где она определена.

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

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