← Назад к вопросам

Что такое переопределение функции?

1.3 Junior🔥 121 комментариев
#ООП

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое переопределение функции?

Переопределение функции — это процесс создания функции с тем же именем, но с другой реализацией или сигнатурой. В JavaScript это приводит к перезаписи (overwriting), а в TypeScript это может означать перегрузку (overloading) или переопределение в подклассе (overriding).

В JavaScript: Перезапись функции

function greet(name) {
  return `Hello, ${name}!`;
}

console.log(greet("Alice")); // "Hello, Alice!"

function greet(name) {
  return `Hi, ${name}!`;
}

console.log(greet("Bob")); // "Hi, Bob!"

В TypeScript: Перегрузка (Overloading)

function add(a: number, b: number): number;
function add(a: string, b: string): string;

function add(a: number | string, b: number | string): number | string {
  if (typeof a === "number" && typeof b === "number") {
    return a + b;
  }
  if (typeof a === "string" && typeof b === "string") {
    return a + b;
  }
  throw new Error("Invalid types");
}

console.log(add(1, 2));        // 3
console.log(add("Hello", " World")); // "Hello World"

В ООП: Переопределение в подклассе (Overriding)

class Animal {
  speak() {
    console.log("Animal makes a sound");
  }
}

class Dog extends Animal {
  speak() {
    console.log("Dog barks");
  }
}

const dog = new Dog();
dog.speak(); // "Dog barks"

Практический пример в Node.js Backend

class UserService {
  async getUser(id: string) {
    return await db.query("SELECT * FROM users WHERE id = $1", [id]);
  }
}

class PremiumUserService extends UserService {
  async getUser(id: string) {
    const user = await super.getUser(id);
    user.benefits = await this.getPremiumBenefits(id);
    return user;
  }

  private async getPremiumBenefits(id: string) {
    return await db.query("SELECT * FROM premium_benefits WHERE user_id = $1", [id]);
  }
}

Методы объектов

const obj = {
  method: function() {
    return "version 1";
  }
};

obj.method = function() {
  return "version 2";
};

console.log(obj.method()); // "version 2"

Множественная перегрузка

class Logger {
  log(message: string): void;
  log(message: string, level: "info" | "warn" | "error"): void;
  
  log(message: string, level: string = "info"): void {
    console.log(`[${level.toUpperCase()}] ${message}`);
  }
}

const logger = new Logger();
logger.log("Simple message");
logger.log("Warning message", "warn");

Важные отличия

  • Overwriting (JavaScript) — замена функции полностью
  • Overloading (TypeScript) — разные сигнатуры, одна реализация
  • Overriding (ООП) — замена метода в подклассе
Что такое переопределение функции? | PrepBro