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 變數標記字串尾...