call,bind,apply

121 阅读1分钟

call参数多个

bind参数2个,第二个是数组

bind参数多个,返回的是一个函数

参考小伙伴:github.com/mqyqingfeng…

var sb = {
    name: 'sb'
}
function bar(){
    console.log(this.name);
}
// call实现
 Function.prototype.myCall = function(context){
    if(typeof this !=='function') return;
    var obj = context || window;
    obj.fn = this;
    var argArr = [...arguments].slice(1);
    var result = obj.fn(...argArr);
    delete obj.fn;
    return result;
}
bar.myCall(sb)


// apply
Function.prototype.myApply = function(context){
    if(typeof this !== 'function') return;
    var obj = context || window;
    obj.fn = this;
    var argsArr = [...arguments].slice(1);
    var result = obj.fn(context, argsArr);
    delete obj.fn;
    return result;
}
bar.myApply(sb);

// bind
Function.prototype.myBind = function(context){
    if(typeof this !== 'function') return;
    var that = this;
    var argsArr = [...arguments].slice(1);
    return function Fn(){
        return that.apply( this instanceof Fn? this : context, argsArr);
    }
}

var sbb = bar.myBind(sb);
sbb();