遇事不決看原始碼

2021-10-24 07:14:16 字數 2704 閱讀 9211

手撕常用原始碼為面試中必備的技能,歡迎各位大佬一起**指正~

首先了解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原始碼進行了一次研究,那時看原始碼的方式基本上是從上往下看,結果看著看著就看不下去了,後來找了乙個很老的版本看,但看的還是不太懂,於是想著乾脆...