Spec-Zone.ru › JavaScript

Функция: prototype

Свойство данных prototype экземпляра Function используется, когда функция используется в качестве конструктора с оператором new. Оно станет прототипом нового объекта.

Примечание: Не все объекты Function имеют свойство prototype — см. описание.

Значение

Объект.

Атрибуты свойства 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"

Спецификации

Спецификация
ECMAScript® 2027 Language Specification
# sec-function-instances-prototype

См. также

  • Function
  • Наследование и цепочка прототипов

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API