Spec-Zone.ru › JavaScript

TypeError: X.prototype.y вызван для несовместимого типа

Исключение JavaScript "called on incompatible target (or object)" возникает, когда функция (для данного объекта) вызывается с this, не соответствующим типу, ожидаемому функцией.

Сообщение

TypeError: Method Set.prototype.add called on incompatible receiver undefined (V8-based)
TypeError: Bind must be called on a function (V8-based)
TypeError: Illegal invocation (V8-based)
TypeError: Function.prototype.toString requires that 'this' be a Function (V8-based)
TypeError: this is not a Date object. (V8-based)
TypeError: this is not a typed array. (V8-based)
TypeError: Function.prototype.toString called on incompatible object (Firefox)
TypeError: Function.prototype.bind called on incompatible target (Firefox)
TypeError: 'addEventListener' called on an object that does not implement interface EventTarget. (Firefox)
TypeError: Type error (Safari)
TypeError: undefined is not an object (Safari)

Тип ошибки

TypeError

Что пошло не так?

Когда выбрасывается эта ошибка, функция (для данного объекта) вызывается с this, не соответствующим типу, ожидаемому функцией.

Эта проблема может возникнуть при использовании методов Function.prototype.call() или Function.prototype.apply(), и предоставлении this аргумента, который не имеет ожидаемого типа.

Эта проблема также может возникнуть при передаче функции, которая хранится как свойство объекта, в качестве аргумента другой функции. В этом случае объект, который хранит функцию, не будет this целью этой функции при ее вызове другой функцией. Чтобы обойти эту проблему, вам нужно либо обернуть вызываемую функцию в другую функцию, либо использовать метод Function.prototype.bind(), чтобы принудительно установить аргумент this для ожидаемого объекта.

Примеры

Некорректные случаи

const mySet = new Set();
["bar", "baz"].forEach(mySet.add);
// mySet.add is a function, but "mySet" is not captured as this.

function myFun() {
  console.log(this);
}
["bar", "baz"].forEach(myFun.bind);
// myFun.bind is a function, but "myFun" is not captured as this.

Корректные случаи

const mySet = new Set();
["bar", "baz"].forEach(mySet.add.bind(mySet));
// This works due to binding "mySet" as this.

function myFun() {
  console.log(this);
}
["bar", "baz"].forEach((x) => myFun.bind(x));
// This works using the "bind" function. It creates a new function forwarding the argument.

См. также

  • Function.prototype.call()
  • Function.prototype.apply()
  • Function.prototype.bind()

© 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/Errors/Called_on_incompatible_type

Spec-Zone.ru

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