编辑代码

// 1.bind 的参数可以在绑定和调用的时候分两次传入
// 2.bindArgs 是绑定时除了第一个参数以外传入的参数,args 是调用时候传入的参数,将二者拼接后一起传入
// 3.如果使用 new 运算符构造绑定函数,则会改变 this 指向,this 指向当前的实例
// 4.通过 Fn 链接原型,这样 fBound 就可以通过原型链访问父类 Fn 的属性

Function.prototype.myBind = function (context) {
    let that = this;
    let bindArgs = Array.prototype.splice.call(arguments, 1);
    function Fn() { }
    Fn.prototype = this.prototype;
    function FuncBind() {
        let args = Array.prototype.splice.call(arguments)
        return that.apply(this instanceof FuncBind ? this : context, bindArgs.concat(args))
    }
    FuncBind.prototype = new Fn()
    return Function
}