var foo = ;
function fn()
fn.call(foo); // 1
注意:
1、call改變了this的指向,指到foo
2、fn函式執行
即可將上面的**改變成下面這種形式:
var foo =
};foo.fn(); // 1
即將fn作為物件foo的屬性,然後進行呼叫。
則可總結出模擬實現的步驟:
1、將函式設定為物件的屬性,注意該函式逇引數處理。
2、執行該函式;
3、刪除該函式。
故call的模擬實現如下:
function.prototype.mycall = function
(context) //函式的引數第乙個是this的指向,第二個以後才是自己的引數,故從1開始迴圈存入引數
var result = eval('context.fn(' + args +')');//args可自動呼叫array.tostring()方法
delete context.fn;
return result; //函式的返回值
}
(context, arr)
else
result = eval('context.fn(' + args + ')')
}delete context.fn;
return result;}
bind:bind() 方法會建立乙個新函式。
當這個新函式被呼叫時,bind()的第乙個引數將作為它執行時的 this,之後的一串行引數將會在傳遞的實參前傳入作為它的引數。
特點:
1. 返回乙個函式
2. 可以傳入引數
根據這兩個特點可模擬如下:
function.prototype.bind2 = function
(context) //如果呼叫bind的不是函式則報錯
var self = this; //self指呼叫該方法的函式
var args = array.prototype.slice.call(arguments, 1);//獲取bind2函式從第二個引數到最後乙個引數
var fnop = function
() {};
//用乙個空函式作為中轉,將fbound.prototype = this.prototype
var fbound = function
() //當作為建構函式時,this指向例項,self指向繫結函式,當結果為true時,this指向例項
//當作為普通函式時,this指向window,self指向繫結函式,當結果為false時,this指向繫結的context
fnop.prototype = this.prototype;
fbound.prototype = new fnop();
//修改返回函式的prototype為繫結函式的prototype,例項就可以繼承函式原型中的值
return fbound;
}
js物件之call,apply方法
首先我們來看看call如何借調方法 下面來演示一下 這樣就行了,注意被借調的不管是原型物件方法還是私有的方法只要是這個例項的屬性裡面有的都可以借調,換句話說,由建構函式例項化出來的內容都可以被借調,而這個例項出來的物件裡面含有建構函式裡面的內容和原型物件裡面的內容。有人碩這樣乙個乙個的借調有點麻煩,...
js 難點之call,apply實現
1 function bar bar.call foo 1 bar 函式執行了 1,bar function foo.bar 1 執行該函式 刪除該函式 foo.fn bar 第二步 foo.fn 第三步 delete foo.fn function.prototype.call2 function...
js中call,apply和bind方法
語法 任意函式.call 任意物件,引數1,引數2 特徵 call能呼叫函式,後面可傳入多個引數,用逗號隔開 3.價值 任意物件都能呼叫任意函式 功能 function fn a,b var obj2 fn.call obj2,你好 6 這樣就能為obj2新增乙個屬性abc,值為 你好6 原因是使用...