1. 程式人生 > >原生JS模擬實現call、apply、bind

原生JS模擬實現call、apply、bind

i++ arguments rgs ole ++ fbo for () ply

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);

原生JS模擬實現call、apply、bind