通过call+apply实现bind

    // 1、函数A调用bind方法时,需要传递参数
    // 2、返回一个新的函数B
    // 3、函数B在执行的时候,还是使用A的功能,但是this指向改变了
    // 4、函数B在执行的时候,传递的参数会拼接到bind方法的参数后面,然后一起在内部传递给A执行
    // 5、new B()的构造函数仍然是A,改变this指向不会起任何作用
Function.prototype.myBind = function (target) {
    // target : 改变返回函数执行的this指向
    var self = this;
    var args = [].slice.call(arguments, 1);
    var temp = function () { }; // 一个临时函数,用于保存原本的prototype
    var f = function () {
        var _args = args.concat([].slice.call(arguments, 0));
        // 如果使用new的方式调用新返回的函数,那么不改变原本的this指向
        // 否则this指向改为target,再否则如果没有传入target,就默认指向window
        var _target = this instanceof temp ? self : (target || window);
        return self.apply(_target, _args); 
    }
    temp.prototype = self.prototype;
    f.prototype = new temp();
    return f;
}

function show(a, b, c, d) {
    console.log(this, a, b, c, d);
}
var obj = {
    a: 1
}
var newShow = show.myBind(obj, "a", "b", "c");

newShow("d"); // {a: 1} "a" "b" "c" "d"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值