let obj={
name:'我'
}
function fn(country,type){
console.log(this.name+'是'+country+type);
}
let newFn=fn.bind(obj,'中國');
newFn('人');
複製代碼
打印結果:我是中國人.
bash
咱們能夠得出結論:app
Function.prototype.mybind=function(context){
let fn=this;//先保存須要執行的函數
return function(){
fn.apply(context);//讓原函數執行並經過apply改變this指向
}
}
複製代碼
Function.prototype.mybind=function(context){
let fn=this;//先保存須要執行的函數
let binArgs=[].slice.call(arguments,1);//獲取綁定this指向時的參數
return function(){
let reargs=[].slice.call(arguments);//獲取調用綁定this後函數的參數
fn.apply(context,binArgs.concat(reargs));//讓原函數執行並經過apply改變this指向,合併兩次傳遞的參數
}
}
複製代碼
另外,bind還有一個特色:調用完bind後返回的函數,還能夠把這個函數當成一個類來調用. 用法:函數
let obj={
name:'我'
}
function fn(country,type){
this.name='你'
}
fn.prototype.city='北京'
let newFn=fn.bind(obj)
let oBind= new newFn();
console.log(oBind);
console.log(oBind.city);
複製代碼
結果打印出: fn {name: "你"} 北京 咱們能夠得出結論:ui
增長判斷this
if(this instanceof fBound){
fn.apply(this,binArgs.concat(args));
}else{
fn.apply(context,binArgs.concat(args));
}
複製代碼
並讓返回的函數原型指向構造函數的原型spa
fBound.prototype=this.prototype;
複製代碼
代碼整合後:prototype
Function.prototype.mybind=function(context){
let fn=this;
let binArgs=[].slice.call(arguments,1)
function fBound(){
let reargs=[].slice.call(arguments)
if(this instanceof fBound){
fn.apply(this,binArgs.concat(reargs));
}else{
fn.apply(context,binArgs.concat(reargs));
}
}
fBound.prototype=this.prototype
return fBound
}
複製代碼