Note 1: Bound functions do not have prototypes
const target = { foo: "bar" };
const f = function() {};
const bound = f.bind(target);
console.log("f.prototype", f.prototype);
console.log("bound.prototype", bound.prototype);
VM439:4 f.prototype {constructor: ƒ}
VM439:5 bound.prototype undefined
Note 2: Arrow functions cannot be bound
const target = { foo: "bar", toString: function() { return "foobar"; } };
const normal = function() { return this; };
const arrow = () => { return this; };
const boundNormal = normal.bind(target);
const boundArrow = arrow.bind(target);
console.log("normal()", normal());
console.log("boundNormal()", boundNormal());
console.log("arrow()", arrow());
console.log("boundArrow()", boundArrow());
console.log("normal.call(target)", normal.call(target));
console.log("arrow.call(target)", arrow.call(target));
normal() Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, parent: Window, …}
boundNormal() {foo: "bar", toString: ƒ}
arrow() Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, parent: Window, …}
boundArrow() Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, parent: Window, …}
normal.call(target) {foo: "bar", toString: ƒ}
arrow.call(target) Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, parent: Window, …}