手動實現柯里化函式 new操作符

2021-10-23 14:47:36 字數 1766 閱讀 3265

優點:節省大量重複引數,**看起來更簡潔,邏輯更清晰

缺點:閉包通用毛病 變數得不到釋放 會一直占用記憶體,執行效率較低

function

currying

(fn, args=

)returnfn(

..._args)

// 否則就是引數收集完畢 將 add 函式處理結果返回 args 長度不能大於 add 函式的引數個數 會報錯}}

function

add(a,b)

function

foo(a,b,c,d,e,f)

let cunt =

currying

(add)(1

)// 另一種寫法 let cunt = currying(add, [1]) 相當於開始的時候就將引數固定了

console.

log(

cunt(2

))// 輸出 3

let cunt1 =

currying

(foo)

cunt1(1

)(2)

(3)(

4)(5

)(6)

// 輸出 21 也可以 cunt1(1,2,3,4,5,6) 輸出一致

// cunt cunt1 傳入的引數只要不超過對應 處理邏輯函式(add、foo) 的引數個數就不會報錯

let cunt2 =

currying

(foo,[1

,2,3

])// 固定引數 如果每次都要1、2、3參與運算 就不用每次都傳入1、2、3

cunt2(4

)(5)

(6)// 傳入變動的引數 輸出結果一致

// 測試時不要使用 箭頭函式 箭頭函式的this指向上級函式的this 此時收集的是上級函式的 arguments 當然自己能處理 此處略過 vue專案中測試注意this指向

做什麼了

1、建立新物件,讓新物件的_proto_指向建構函式的原型物件prototype

2、執行建構函式

3、如果建構函式的返回值為object型別則作為new方法的返回值返回,否則返回建立的新物件

實現

function

_new()

// 建立新物件

let func = arguments[0]

// 拿到建構函式

let args = array.

form

(arguments)

.slice(1

)// 拿到除建構函式外剩餘的引數

obj._proto_ = func.prototype // 讓新物件的_proto_指向建構函式的原型物件prototype

let result = func.

call

(obj,

...args)

// 執行建構函式

if(result &&

typeof result ===

'function'

||typeof result ===

'object'

)return obj // 否則返回新物件 obj

}// 測試**

functionfn(

)let foo =

_new

(fn)

console.

log(foo)

// 輸出 , name:'張三'}

不會表達 大致就是那個意思 僅供學習 歡迎指正錯誤之處

實現new操作符

new操作符返回乙個物件,所以需要在函式內部返回乙個物件。這個物件,也就是建構函式中的this,可以訪問到掛載在this上的任意屬性。這個物件可以訪問到建構函式原型上的屬性,所以需要將物件與建構函式鏈結起來。只有返回值是物件,才進行正常處理。const create constructor,args...

js 實現new操作符

new操作符做了什麼 建立乙個空的物件,即 空物件的原型指向建構函式的原型,即設定該物件的建構函式 讓this指向新建立的空物件,即新建立的物件作為this的上下文 判斷返回值的型別,如果是值型別就是返回新的建立物件,如果是引用型別就返回引用型別的物件。如果沒有返回物件型別object包括funct...

new操作符實現原理

new操作符實現原理 function news func 生成新物件 target.proto func.prototype 例項的 proto 指向原型,建構函式的prototype也指向原型 鏈結到原型 var res func.call target 把函式的this繫結在了新生成的物件中 ...