// 总结:
// 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