X.prototype.y called on incompatible type

Message

TypeError: 'this' is not a Set object (EdgE)
TypeError: Function.prototype.toString called on incompatible object (Firefox)
TypeError: Function.prototype.bind called on incompatible target (Firefox)
TypeError: Method Set.prototype.add called on incompatible receiver undefined (Chrome)
TypeError: Bind must be called on a function (Chrome)

Tipe error

TypeError

Apa yang salah?

Ketika error ini dilempar, suatu fungsi (dari objek yang diberikan), dipanggil dengan this tidak berkorespondensi ke tipe yang diharapkan fungsi tersebut.

Isu ini bisa terbit ketika menggunakan metode Function.prototype.call() atau Function.prototype.apply(), dan menyediakan argumen this yang tak punya tipe yang diharapkan.

Isu ini juga bisa terjadi ketika menyediakan fungsi yang disimpan sebagai properti suatu objek sebagai argumen fungsi lain. Dalam hal ini, objek yang menyimpan fungsi tersebut takkan menjadi target this target dari fungsi itu ketika dipanggil oleh fungsi lain. Untuk mengatasi isu ini, kamu harus menyediakan lambda yang membuat panggilan, ataupun menggunakan fungsi Function.prototype.bind() untuk memaksa argumen this ke objek yang diharapkan.

Contoh

Kasus tak valid

var mySet = new Set;
['bar', 'baz'].forEach(mySet.add);
// mySet.add adalah fungsi, tapi "mySet" tidak dikaptur sebagai this.

var myFun = function () {
  console.log(this);
};
['bar', 'baz'].forEach(myFun.bind);
// myFun.bind adalah fungsi, tapi "myFun" tidak dikaptur sebagai this.

Kasus valid

var mySet = new Set;
['bar', 'baz'].forEach(mySet.add.bind(mySet));
// Ini berjalan karena mengikat "mySet" sebagai this.

var myFun = function () {
  console.log(this);
};
['bar', 'baz'].forEach(x => myFun.bind(x));
// Ini berjalan menggunakan fungsi "bind". Ia membuat lambda yang meneruskan argumen.

Lihat juga