Вопрос проверяет понимание различий между свойствами функции как объекта и свойствами её прототипа, что важно для работы с конструкторами и наследованием в JavaScript.
В JavaScript функции являются объектами, поэтому им можно добавлять свойства напрямую, как любому другому объекту. Однако, когда функция используется как конструктор (с ключевым словом new), создаётся новый объект (экземпляр), который наследует свойства из прототипа функции, но не получает прямые свойства самой функции.
Свойство, добавленное напрямую в функцию, принадлежит самому объекту функции. Оно доступно только через обращение к функции, но не через экземпляры, созданные с помощью этой функции.
function Car(model) {
this.model = model;
}
// Добавляем свойство напрямую в функцию
Car.manufacturer = 'Toyota';
const myCar = new Car('Corolla');
console.log(Car.manufacturer); // 'Toyota'
console.log(myCar.manufacturer); // undefined
console.log(myCar.model); // 'Corolla'Чтобы свойство было доступно у всех экземпляров, его нужно добавить в prototype функции. Тогда оно будет унаследовано через цепочку прототипов.
Car.prototype.getDetails = function() {
return `${this.model} by ${Car.manufacturer}`;
};
console.log(myCar.getDetails()); // 'Corolla by Toyota'Прямые свойства функций часто используются для:
Например, в классе Math все методы статические и вызываются напрямую через Math, а не через экземпляры.
Вывод: Прямые свойства функций полезны для статических членов, которые не зависят от состояния экземпляра, в то время как свойства в prototype нужны для методов и данных, которые должны быть доступны каждому экземпляру.