Function.prototype.myBind = function(ctx){
var ctx = ctx ? Object(ctx) : window,
originFn = this,
args = [].slice.call(arguments, 1), //从第二个参数开始获取
//原型传递中介函数
_tempFn = function(){};
var newFn = function(){
//返回新函数的参数列表
var newArgs = [].slice.call(arguments);
//如果返回的新函数进行new, this -> newFn构造函数, 否则 this -> ctx
return originFn.apply(this instanceof newFn ? this : ctx, args.concat(newArgs));
}
//使用圣杯模式,目的是函数之间不会共用同一个原型链
_tempFn.prototype = this.prototype;
newFn.prototype = new _tempFn();
return newFn;
}
function test(){
console.log(this, arguments);
}
test.prototype.myLove = 'xiaohong';
var t = test.myBind({
a: 'xiao',
b: 'hong'
}, 'zhangsan');
t('lisi');
var newFn = new t('wangwu');
console.log(newFn.myLove);
结果: