Функция: prototype
Свойство данных prototype экземпляра Function используется, когда функция используется в качестве конструктора с оператором new. Оно станет прототипом нового объекта.
Значение
Объект.
Атрибуты свойства Function: prototype
| |
|---|---|
| Записываемое | да |
| Перечисляемое | нет |
| Конфигурируемое | нет |
Примечание: Классы — это тип функции, поэтому большая часть этого описания применима и к свойству prototype классов. Единственное существенное отличие состоит в том, что свойство prototype класса не является записываемым.
Описание
Когда функция вызывается с new, свойство prototype конструктора становится прототипом результирующего объекта.
function Ctor() {}
const inst = new Ctor();
console.log(Object.getPrototypeOf(inst) === Ctor.prototype); // true
Вы можете прочитать Наследование и цепочка прототипов (Inheritance and the prototype chain) для получения дополнительной информации о взаимодействии между свойством prototype функции-конструктора и прототипом результирующего объекта.
Наличие свойства prototype у функции недостаточно для того, чтобы она могла быть конструктором. Функции-генераторы имеют свойство prototype, но не могут быть вызваны с помощью new:
async function* asyncGeneratorFunction() {}
function* generatorFunction() {}
Вместо этого, свойство prototype функций-генераторов используется, когда они вызываются без new. Свойство prototype станет прототипом возвращаемого объекта Generator.
Кроме того, некоторые функции могут иметь prototype, но безусловно выбрасывают исключение при вызове с new. Например, функции Symbol() и BigInt() выбрасывают исключение при вызове с new, поскольку Symbol.prototype и BigInt.prototype предназначены только для предоставления методов для примитивных значений, а объекты-обёртки не должны конструироваться напрямую.
Следующие функции не имеют prototype и, следовательно, не могут быть конструкторами, даже если свойство prototype будет позже назначено вручную:
const method = { foo() {} }.foo;
const arrowFunction = () => {};
async function asyncFunction() {}
Следующие являются допустимыми конструкторами, которые имеют prototype:
class Class {}
function fn() {}
Привязанная функция (bound function) не имеет свойства prototype, но может быть конструируемой. При её конструировании вместо неё конструируется целевая функция, и если целевая функция конструируема, она возвращает обычный экземпляр.
const boundFunction = function () {}.bind(null);
Свойство prototype функции по умолчанию представляет собой простой объект с одним свойством: constructor, которое является ссылкой на саму функцию. Свойство constructor является записываемым, неперечисляемым и конфигурируемым.
Если prototype функции переназначается чем-то, отличным от Object, при вызове функции с new прототипом возвращаемого объекта будет Object.prototype. (Другими словами, new игнорирует свойство prototype и конструирует простой объект.)
function Ctor() {}
Ctor.prototype = 3;
console.log(Object.getPrototypeOf(new Ctor()) === Object.prototype); // true
Примеры
Изменение прототипа всех экземпляров путем мутации свойства prototype
function Ctor() {}
const p1 = new Ctor();
const p2 = new Ctor();
Ctor.prototype.prop = 1;
console.log(p1.prop); // 1
console.log(p2.prop); // 1
Добавление свойства, не являющегося методом, в свойство prototype класса
Поля класса (Class fields) добавляют свойства каждому экземпляру. Методы класса объявляют функциональные свойства в прототипе. Однако нет способа добавить свойство, не являющееся функцией, в прототип. Если вы хотите совместно использовать статические данные между всеми экземплярами (например, Error.prototype.name одинаков для всех экземпляров ошибок), вы можете назначить их вручную для prototype класса.
class Dog {
constructor(name) {
this.name = name;
}
}
Dog.prototype.species = "dog";
console.log(new Dog("Jack").species); // "dog"
Это может быть сделано более эргономичным с помощью блоков статической инициализации (static initialization blocks), которые вызываются при инициализации класса.
class Dog {
static {
Dog.prototype.species = "dog";
}
constructor(name) {
this.name = name;
}
}
console.log(new Dog("Jack").species); // "dog"
Спецификации
См. также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/prototype