Function.prototype.mybind = function (ctx) {
const args = Array.prototype.slice.call(arguments, 1)
const fn = this
return function A() {
const resultArgs = Array.prototype.slice.call(arguments)
const valArgs = args.concat(resultArgs)
if (Object.getPrototypeOf(fn) === A.prototype) {
const obj = {}
Object.setPrototypeOf(obj, fn.prototype)
const result = fn.apply(obj, valArgs)
return typeof result === 'object' ? result : obj
}
else {
return fn.apply(ctx, valArgs)
}
}
}
function fn(a, b, c, d) {
console.log(this, a, b, c, d)
}
const newFun = fn.bind('ctx', 1, 2)
const result = new newFun(3, 4)
console.log(result)
console