function call_mock (obj) { var aim_fun = this; var argument = []; for (var i = 1; i < arguments.length; i++) { argument.push(arguments[i]); } obj.aim_fun = aim_fun; var result = eval('obj.aim_fun('+ argument.join() + ')'); delete obj.aim_fun; return result; } Function.prototype.call_mock = call_mock; function apply_mock (obj, args) { var aim_fun = this; obj.aim_fun = aim_fun; var result = eval('obj.aim_fun('+ args.join() + ')'); delete obj.aim_fun; return result; } Function.prototype.apply_mock = apply_mock; function bind_mock (obj) { var aim_fun = this; var argument = []; for (var i = 1; i < arguments.length; i++) { argument.push(arguments[i]); } var fNOP = function () {}; var fBound = function () { return aim_fun.apply_mock(obj, argument) } fNOP.prototype = this.prototype; fBound.prototype = new fNOP(); return fBound; } Function.prototype.bind_mock = bind_mock; var a = { c:1, see(a, b) { console.log(`${this.c}${a}${b}`); } } c = 0; a.see.bind_mock(global, 1, 2);