手撕常用原始碼為面試中必備的技能,歡迎各位大佬一起**指正~
首先了解new對例項化建構函式時內部實現了啥:
建立乙個控物件
將建構函式的原型物件新增到這個物件的**屬性__proto__
執行建構函式當函式返回物件的時候,返回物件
當函式返回非物件的時候返回這個ob j
具體**實現邏輯如下
// es5寫法
function
newp
(con,...args)
// es3
function
newp()
上面new的例子在es5的寫法中用到了object.create的寫法,因此我們了解到object.create的作用是建立乙個新物件,使用現有的物件作為新建立物件的prototype。:
先生成乙個空物件
將傳入的物件新增到這個物件的**屬性__proto__中
最後的生成的物件的原型物件的constructor屬性要指向建立的物件
具體**實現邏輯如下
function
create
(object)
學習過原型鏈的都知道判斷乙個物件是否在某個原型鏈上,以及判別引用型別的方法不能用typeof, 而是instanceof 那麼手撕一波:
// 1. 檢測建構函式的 prototype 屬性是否出現在某個例項物件的原型鏈
// 2. object.getprototypeof(obj(要返回其原型的物件)) 方法返回指定物件的原型(內部[[prototype]]屬性的值)。
// 3. 返回值:給定物件的原型。l.__proto__.__proto__ 直到 proto 為 null,則返回 null 。
// 4. 函式中的while(true) 不會無限迴圈,當出發return結束迴圈
function
instanceofp(l
,r)let l =l.
getprototypeof(l
);const r =
r.prototype;
while
(l !==
null
) l = l.
getprototypeof
(l)}
}
bind做了啥
bind是function原型鏈中的function.prototype的乙個屬性,
它是乙個函式,修改this指向,合併引數傳遞給原函式,返回值是乙個新的函式。
bind返回的函式, 可以通過new呼叫,返回原函式的例項,但是不改變this指向
指向了new生成的全新物件。內部模擬實現了new操作符。
/* eslint-disable no-extend-native */
function.prototype.
bind3
=function()
const func =
this
;const args = array.prototype.slice.
call
(arguments,1)
;const content = array.prototype.shift.
call
(arguments)
;return
functionf(
)return func.
(content, arg);}
;};
// 引數你也可以指定(self, ... agrs)我這裡用arguments只是單純為了裝b
function.prototype.
callp
=function()
const args = array.prototype.slice.
call
(arguments,1)
;const content =
this
;// 為什麼用shift, 問就是為了裝b
const self = array.prototype.shift.
call
(arguments)||;
self.fuc = content;
const res = self.
fuc(
...args)
;// 這裡一定要記的刪掉this中新增的函式屬性
delete self.fuc;
return res;
};
/* eslint-disable no-extend-native */
function.prototype.
=function
(self, args)
const content =
this
;const selfp = self ||
; selfp.content = content;
const res = self.
content
(...args)
;// 一定要將新增到修改函式this指向中的函式去掉
delete self.content;
return res;
};
如果各位大佬覺得還不錯請給個素質3連,歡迎各位大佬提出更好的寫法~ 看QtDesigner原始碼
畢業有一年半了,很早就想著寫部落格,可是水平有限,表達能力也差好多,但是現在總結來說,好多東西都忘了,浪費了好多時間,所以開始寫東西吧。1.pro檔案檢視專案構成 template subdirs config qt subdirs src 樣板 模板 型板 就是乙個模板,然後我在data資料夾裡看...
第六章 MakeFile遇事不決先百度 谷歌
2019 7 19 在前兩天,我終於遇到了人生中第一次關於makefile的問題.遇到這個問題,對於編譯器的理解和認知也會提公升很多,會有種恍然大悟的感覺.眾所周知我們在編譯器除錯的時候是分為兩步驟 預編譯和鏈結 其中我們會把檔案分開來寫 通過include來包含其他檔案,但通常會出現重複包含從而報...
jQuery原始碼研究 怎麼看原始碼
這幾天有想看原始碼的想法,於是就開始了原始碼的研究,經過幾天的摸索發現看原始碼還是有點技巧在裡面的,想著把這些東東寫下來作為乙個小總結。在乙個多月前我對vue原始碼進行了一次研究,那時看原始碼的方式基本上是從上往下看,結果看著看著就看不下去了,後來找了乙個很老的版本看,但看的還是不太懂,於是想著乾脆...