優點:節省大量重複引數,**看起來更簡潔,邏輯更清晰
缺點:閉包通用毛病 變數得不到釋放 會一直占用記憶體,執行效率較低
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繫結在了新生成的物件中 ...