У какого объекта JavaScript есть prototype
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Объекты, имеющие 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 и избегания распространенных ошибок.