TypeError: X.prototype.y wurde auf einem inkompatiblen Typ aufgerufen
Der JavaScript-Fehler "called on incompatible target (or object)" tritt auf, wenn eine Funktion (auf einem gegebenen Objekt) mit einem this
aufgerufen wird, das nicht dem von der Funktion erwarteten Typ entspricht.
Nachricht
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)
Fehlertyp
Was ist schiefgelaufen?
Wenn dieser Fehler ausgelöst wird, wird eine Funktion (auf einem gegebenen Objekt) mit einem this
aufgerufen, das nicht dem von der Funktion erwarteten Typ entspricht.
Dieses Problem kann auftreten, wenn die Methoden Function.prototype.call()
oder Function.prototype.apply()
verwendet werden und ein this
-Argument angegeben wird, das nicht den erwarteten Typ hat.
Dieses Problem kann auch auftreten, wenn eine Funktion, die als Eigenschaft eines Objekts gespeichert ist, als Argument an eine andere Funktion übergeben wird. In diesem Fall wird das Objekt, das die Funktion speichert, nicht das this
-Ziel dieser Funktion sein, wenn sie von der anderen Funktion aufgerufen wird. Um dieses Problem zu umgehen, müssen Sie entweder die Rückruffunktion in eine andere Funktion einbetten oder die Methode Function.prototype.bind()
verwenden, um das this
-Argument auf das erwartete Objekt zu erzwingen.
Beispiele
Ungültige Fälle
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.
Gültige Fälle
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.