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)
Тип ошибки
Что пошло не так?
Когда выбрасывается эта ошибка, функция (для данного объекта) вызывается с 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.
См. также
© 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