TypeError: X.prototype.y auf inkompatiblen Typ aufgerufen
Die JavaScript-Ausnahme "auf inkompatiblem Ziel (oder Objekt) aufgerufen" tritt auf, wenn eine Funktion (auf einem gegebenen Objekt) mit einem this
aufgerufen wird, das nicht dem von der Funktion erwarteten Typ entspricht.
Meldung
TypeError: Method Set.prototype.add called on incompatible receiver undefined (V8-based) TypeError: Bind must be called on a function (V8-based) TypeError: Function.prototype.toString called on incompatible object (Firefox) TypeError: Function.prototype.bind called on incompatible target (Firefox) TypeError: Type error (Safari) TypeError: undefined is not an object (Safari)
Fehlerart
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 dabei ein this
-Argument bereitgestellt 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 jener Funktion sein, wenn sie von der anderen Funktion aufgerufen wird. Um dieses Problem zu umgehen, müssen Sie entweder die Callback-Funktion in eine andere Funktion einwickeln oder die Methode Function.prototype.bind()
verwenden, um das this
-Argument auf das erwartete Objekt festzulegen.
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.
const myFun = function () {
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.
const myFun = function () {
console.log(this);
};
["bar", "baz"].forEach((x) => myFun.bind(x));
// This works using the "bind" function. It creates a new function forwarding the argument.