SOURCE

// 总结: 
//  1.函数A调用bind方法的时候,需要传递的参数o(this指向), x, y, z....
//  2.返回新的函数
//  3.返回的新的函数在执行的时候,具体的函数功能还是使用以前的,只不过this指向变成了o  window(什么都不传)
//  4.返回的函数在执行的时候,传递的参数会拼接到bind绑定的传参的后面。
//  5.如果把返回的函数,当作构造函数,进行new的操作,构造函数依旧是A,不会改变this的指向

/**
 * param {Object} target this的指向
 */
Function.prototype.newBind = function(target) {
    // this 该函数this指向的是A
    const _this = this;
    const arg = [].slice.call(arguments, 1);
    function temp() {};
    const f = function () {
        const _arg = [].slice.call(arguments, 0);
        _this.apply(target || window, arg.concat(_arg));
    };
    temp.prototype = _this.prototype;
    f.prototype = new temp();
    return f;
};

const a = 'window';
const obj = {
    a:'obj',
}

function A(a, b) {
    console.log(this, a, b);
};
// A();

const B = A.newBind(obj, 'a');
B('b');

console.log(new B().constructor);

console 命令行工具 X clear

                    
>
console