如何模擬實現乙個call apply bind函式

2021-10-07 11:20:47 字數 2058 閱讀 9149

call模擬實現

首先我們實現繫結this功能。

// 比如我們有乙個foo函式

function getname()

// 還有乙個wechat物件

const wechat = ;

// 我們希望實現

getname.call(wechat); // fedaily

以wechat和getname這個為例,這裡的this即getname,context即wechat。

我們將getname賦值給wechat物件的fn熟悉,然後通過wechat物件呼叫,最後刪除這個fn屬性。(實際中我們肯定不能用fn這個名字,避免和物件原本重複,我們可以用symbol實現)

然後我們繫結this的功能就實現。還有傳遞引數,這個也好辦。

function.prototype.call = function () 

// 這裡其實用了es6的語法,但是主要為了更好的說明整個實現過程,理解原理就好

這裡通過arguments物件去獲取傳進來的引數以及this。

然後考慮到函式可能是有返回值的,所以ctx.fn()的執行結果也需要返回。同時this可能為null,那麼我們需要將this指向window。

所以我們再來調整一下:

function.prototype.call = function ()
這樣,我們就模擬實現了乙個call方法。

const [ctx, args] = arguments; // args區別

ctx.fn = this || window;

const result = ctx.fn(...args);

delete ctx.fn;

return result;}

bind模擬實現

bind會返回乙個新函式,新函式執行時的this是bind方法的第乙個引數。

function.prototype.bind = function () 

}

這樣,繫結this的功能我們就實現了。然後bind其實是可以傳遞引數的,bind返回的函式呼叫的時候也是可以再傳遞引數的,同時呼叫bind的方法可能是有返回值的,所以我們處理一下

function.prototype.bind = function () 

}

bind函式還有乙個特性,就是bind返回的函式是可以作為建構函式的,當它作為建構函式時,它之前繫結的this會被忽略。

為了保證bind返回的函式能夠繼承到呼叫函式的原型(即getname的原型)。所以我們需要修改bind返回函式的原型為this的原型(即getname的原型)。

我們再來嘗試一下:

function.prototype.bind = function () 

fbond.prototype = self.prototype;

return fbond;

}

然後為了不會修改原來函式的原型,即getname的原型。我們可以通過乙個中間函式來繼承。

function.prototype.bind = function () 

const [ctx, args] = arguments;

const self = this;

const fnop = function () {};

const fbond = function ()

// 這裡將self的原型賦值給來fnop,後面fbond的原型賦值為new fnop(),這樣就和self的原型斷開了

// 後面再修改fbond的原型也不會影響到self,即getname.prototype

fnop.prototype = self.prototype;

fbond.prototype = new fnop();

return fbond;

}

這樣,我們就實現了乙個比較完整的bind方法了。

Linux下模擬實現乙個微型shell

首先我們先看一下shell的執行過程 shell從使用者讀入字串 ls 並建立乙個新的程序,在那個程序中執行ls程式並等待那個程序結束。然後shell讀取新的一行輸入,建立乙個新的程序,在這個程序中執行程式並等待這個程序結束。所以我們要寫乙個微型shell,需要迴圈以下過程 獲取終端輸入。解析輸入 ...

linux程式設計 模擬實現乙個執行緒池

實現乙個執行緒池需要構建三個類 執行緒任務類給定兩個介面,settask 負責把給的資料和方法傳進任務系統,start 負責將給定資料用給定方法來處理。安全佇列類,負責給執行緒池提供乙個能夠互斥訪問的安全佇列。執行緒池類提供三個介面,threadpool 建立指定數量的執行緒,taskpush 將任...

編寫乙個C語言程式模擬實現strlen函式

strlen函式功能是計算字串中字元的個數.除 0外 而字串本身就是乙個字元陣列,只不過末尾以 0結束.因此,我們只需遍歷除 0之外的所有字元即可.有三種方法可以解決這個問題.方法一 設定乙個整型計數器,遍歷字串.方法二 通過不斷函式自身的遞迴.方法三 與方法一類似,設定乙個char 變數標記字串尾...