<script type="text/javascript"> // 手寫 call 原理詳解 // 核心,在目標對象中創建函數方法等于執行的函數,然后用目標對象調用此方法(此時this指向目標對象),然后刪掉創建的方法,返回結果 // 使用 call apply bind 的都是函數 所以此方法寫在 function 的構造函數 Function 的原型上面 Function.prototype.mycall = function(content){ //創建一個變量,這個變量即一個參數傳過來的對象, 所以這個變量為一個對象 const context = content || window //此處的 this 為調用 .mycall 的函數,個人覺得,調用 mycall 方法的函數為Function的實例,實例調用原型上的 mycall 此處的 this 則指向實例 // console.log(this) //context對象創建 一個函數方法fn 等于函數實例,也就是調用 mycall 的函數 context.fn = this //此處獲取除一個參數以后的所有參數 const arg = [...arguments].slice(1) //在 context 對象中執行 函數實例,調用者為 context 對象 const res = arg.length ? context.fn(...arg) : context.fn(...arg) //為了不影響 context 對象,所以把 context 上掛載的 fn 方法刪掉 delete context.fn //返回結果 return res } Function.prototype.myApply = function(obj) { const context = obj || window context.fn = this const res = arguments[1] ? context.fn(...arguments[1]) : context.fn() delete context.fn return res } const age = 18 const obj = { name:'hong', objName : this.age, myFn(){ console.log(this.name) } } const obj1 = { name: 'hong1', age: 18 } // obj.myFn() // obj.myFn.call(obj1) // obj.myFn.mycall() obj.myFn.myApply(obj1) </script>
人生很漫長,或許我只是你人生中微不足道的一小段,只是你人生中的驚鴻一瞥。
浙公網安備 33010602011771號