Function.prototype.myCall = function (context, ...arr) {
if (context === null || context === undefined) {
// 指定爲 null 和 undefined 的 this 值會自動指向全局對象(瀏覽器中爲window)
context = window
} else {
context = Object(context) // 值爲原始值(數字,字符串,布爾值)的 this 會指向該原始值的實例對象
}
const specialPrototype = Symbol('特殊屬性Symbol') // 用於臨時儲存函數
context[specialPrototype] = this; // 函數的this指向隱式綁定到context上
let result = context[specialPrototype](...arr); // 經過隱式綁定執行函數並傳遞參數
delete context[specialPrototype]; // 刪除上下文對象的屬性
return result; // 返回函數執行結果
};
let test = {
name: "test"
}, fun = {
fn: function () {
console.log(this.name)
}
}
fun.fn.myCall(test)