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

У какого объекта JavaScript есть prototype

2.0 Middle🔥 111 комментариев
#JavaScript Core

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

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

Объекты, имеющие prototype в JavaScript

В JavaScript свойство prototype есть у функций-конструкторов и у классов (ES6+). Это одно из ключевых понятий прототипного наследования в языке. Давайте разберем подробно.

1. Функции-конструкторы

Любая функция, объявленная с помощью function (или стрелочная, но у стрелочных нет prototype), по умолчанию имеет свойство prototype. Это объект, который будет использоваться как прототип для экземпляров, созданных через new.

function Person(name) {
  this.name = name;
}

// У функции Person есть prototype
console.log(Person.prototype); // {constructor: ƒ}

// Создаем экземпляр
const alice = new Person('Alice');
// alice.__proto__ === Person.prototype
console.log(alice.__proto__ === Person.prototype); // true

2. Классы (ES6)

Классы в ES6 — это синтаксический сахар над функциями-конструкторами, поэтому у них также есть свойство prototype.

class Animal {
  constructor(species) {
    this.species = species;
  }
  
  makeSound() {
    console.log('Some sound');
  }
}

// У класса Animal есть prototype
console.log(Animal.prototype); // {constructor: ƒ, makeSound: ƒ}

const dog = new Animal('Dog');
console.log(dog.__proto__ === Animal.prototype); // true

3. Что НЕ имеет prototype

Важно понимать, что обычные объекты, созданные литерально или через Object.create(), не имеют свойства prototype. У них есть внутренняя ссылка [[Prototype]] (доступная через __proto__ или Object.getPrototypeOf()), но это не то же самое, что prototype.

const obj = { a: 1 };
console.log(obj.prototype); // undefined
console.log(obj.__proto__ === Object.prototype); // true

const arr = [1, 2, 3];
console.log(arr.prototype); // undefined
console.log(arr.__proto__ === Array.prototype); // true

4. Как работает prototype

Когда вы создаете объект через new, его внутренняя ссылка [[Prototype]] устанавливается на prototype функции-конструктора. Это позволяет экземплярам наследовать свойства и методы.

function Car(model) {
  this.model = model;
}

// Добавляем метод в prototype
Car.prototype.drive = function() {
  console.log(`${this.model} is driving`);
};

const tesla = new Car('Tesla');
tesla.drive(); // "Tesla is driving"
// Метод найден в Car.prototype через цепочку прототипов

5. Особые случаи

  • Встроенные конструкторы: Object, Array, String, Number, Function и другие имеют prototype, который содержит методы этих типов.
  • Стрелочные функции: Не имеют prototype, поэтому их нельзя использовать как конструкторы.
  • Методы в объектах: Если функция является методом объекта, она все равно имеет prototype, но это редко используется.
// Встроенные конструкторы
console.log(Array.prototype.map); // ƒ map()
console.log(String.prototype.toUpperCase); // ƒ toUpperCase()

// Стрелочная функция
const arrow = () => {};
console.log(arrow.prototype); // undefined
// new arrow(); // Ошибка: arrow is not a constructor

6. Практическое значение

Свойство prototype используется для:

  • Реализации наследования в JavaScript до появления классов
  • Добавления методов всем экземплярам объекта (экономия памяти)
  • Модификации встроенных типов (хотя это считается плохой практикой)
// Добавление метода всем массивам (осторожно!)
Array.prototype.last = function() {
  return this[this.length - 1];
};

console.log([1, 2, 3].last()); // 3

Итог

Свойство prototype есть у:

  • Функций-конструкторов (объявленных через function)
  • Классов ES6+
  • Встроенных конструкторов (Object, Array, и т.д.)

Его нет у:

  • Обычных объектов
  • Экземпляров объектов
  • Стрелочных функций

Понимание этого различия критически важно для работы с прототипным наследованием в JavaScript и избегания распространенных ошибок.