This page was translated from English by the community.Learn more and join the MDN Web Docs community.
X.prototype.y called on incompatible type
Сообщение
TypeError: 'this' не является Set объектом (EdgE)TypeError: Function.prototype.toString вызывается несовместимый объект (Firefox)TypeError: Function.prototype.bind вызывается несовместимая цель (Firefox)TypeError: Метод Set.prototype.add called вызывается несовместимый приёмник undefined (Chrome)TypeError: Bind должен вызываться для функции(Chrome)
In this article
Тип ошибки
TypeErrorЧто пошло не так?
При возникновении этой ошибки вызывается функция (для данного объекта) с типом this, не соответствующим типу, ожидаемому функцией.
Эта проблема может возникнуть при использованииFunction.prototype.call() илFunction.prototype.apply() методы и предоставление аргумента this, который не имеет ожидаемого типа.
Эта проблема также может возникнуть при предоставлении функции (хранящейся в объекте) в качестве аргумента другой функции. В этом случае объект не будет целью this функции. Чтобы обойти эту проблему, необходимо либо предоставить лямбда-код, который выполняет вызов, либо использоватьFunction.prototype.bind() функция для принудительной передачи аргумента this ожидаемому объекту.
Примеры
>Неправильные
var mySet = new Set();["bar", "baz"].forEach(mySet.add);// mySet.add is a function, but "mySet" is not captured as this.var myFun = function () { console.log(this);};["bar", "baz"].forEach(myFun.bind);// myFun.bind is a function, but "myFun" is not captured as this.Правильные
var mySet = new Set();["bar", "baz"].forEach(mySet.add.bind(mySet));// This works due to binding "mySet" as this.var myFun = function () { console.log(this);};["bar", "baz"].forEach((x) => myFun.bind(x));// This works using the "bind" function. It creates a lambda forwarding the argument.