11、手寫apply方法
apply方法的作用:
apply
是一個函數的方法,它允許你調用一個函數,同時將函數的 this
值設置為指定的值,并將函數的參數作為數組(或類數組對象)傳遞給該函數。
與call的區別:
最大的區別就是參數部分:
apply:
function greet(greeting, name) {console.log(greeting + ', ' + name);
}var args = ['Hello', 'Alice'];
greet.apply(null, args); // 輸出: Hello, Alice
call:
function greet(greeting, name) {console.log(greeting + ', ' + name);
}greet.call(null, 'Hello', 'Alice'); // 輸出: Hello, Alice
所以在手寫的時候我們格外要注意apply當中參數的解決:與call不同的就是,apply里面對于args的處理不再是…args,因為傳遞的是一個數組,通過擴展運算符處理數組就好。
// 手寫aoolyFunction.prototype.myApply = function (obj, args) {//args是數組// 先判斷this是不是函數if (typeof this !== 'function') {throw new TypeError("this is not a function")}// 如果是null或者undefiedobj = obj === null || obj === undefined ? globalThis : Object(obj);// 屬性唯一const key = Symbol('temp');obj[key] = this;let res = null;// 要對args進行判斷:null或者undefied// 這里要注意一下:對args進行判斷// args == null 在 JavaScript 中等價于 args === null || args === undefined。if (args == null) {res = obj[key]();} else {res = obj[key](...args);}// 刪除屬性、delete obj[key];return res;}
是否對args進行判斷:
- 在實現
myCall
方法時,通常不需要對args
進行判斷,因為myCall
方法的設計就是接受多個參數,從第二個參數開始,每個參數都會作為函數的參數傳遞。因此,args
參數是一個可變參數列表,不需要進行額外的判斷。 - 然而,在實現
myApply
方法時,需要對args
進行判斷,因為myApply
方法接受一個數組或類數組對象作為參數,需要檢查args
是否為null
或undefined
,如果是,則不傳遞任何參數;否則,使用擴展運算符...args
來傳遞參數。
pe.myApply = function (obj, args) {//args是數組
// 先判斷this是不是函數
if (typeof this !== ‘function’) {
throw new TypeError(“this is not a function”)
}
// 如果是null或者undefied
obj = obj === null || obj === undefined ? globalThis : Object(obj);
// 屬性唯一
const key = Symbol(‘temp’);
obj[key] = this;
let res = null;
// 要對args進行判斷:null或者undefied
// 這里要注意一下:對args進行判斷
// args == null 在 JavaScript 中等價于 args === null || args === undefined。
if (args == null) {
res = objkey;
} else {
res = objkey;
}
// 刪除屬性、
delete obj[key];
return res;
}
``是否對args進行判斷:
- 在實現
myCall
方法時,通常不需要對args
進行判斷,因為myCall
方法的設計就是接受多個參數,從第二個參數開始,每個參數都會作為函數的參數傳遞。因此,args
參數是一個可變參數列表,不需要進行額外的判斷。 - 然而,在實現
myApply
方法時,需要對args
進行判斷,因為myApply
方法接受一個數組或類數組對象作為參數,需要檢查args
是否為null
或undefined
,如果是,則不傳遞任何參數;否則,使用擴展運算符...args
來傳遞參數。