實現call函式,手寫Function.prototype.call函式
實現call函式:
使用call函式:
function fn(x,y){
console.log(this);
return x+ y
}
let obj = {
name:'李雲龍'
}
//1.普通使用
fn(10,20) // this---->window,30
//2.使用call
fn.call(obj,10,20)// this--->obj , 30
思路:
- 為obj新增一個屬性,屬性值就是fn
- 執行那個新增的屬性(方法),獲取返回值,將返回值返回
- 刪除我們新增的屬性
Function.prototype.myCall = function(context,...params){
//此時context---->就是obj
//此時this----->fn
context.xxx = this //為這個物件新增一個方法
let result = context.xxx(...params);//執行這個方法,獲取返回值
delete context.xxx;//刪除我們新增的那個屬性,我們不能改變原本的物件結構
return result
}
//------------------驗證----------------------
function fn(x,y){
console.log(this.name);
return x+ y
}
let obj = {
name:'李雲龍'
}
//1.普通使用
fn(10,20) // this---->window,30
//2.使用call
fn.myCall(obj,10,20)// this--->obj , 30
進一步完善
- 我們新增的屬性,如果和原本的物件的屬性一樣,那麼就會發生改變原來的屬性,這是不允許的
- 對context進行處理,如果是null,那麼就是window,
- 如果context是基本型別值,那麼需要將基本型別值轉化為對應的引用型別值
- new context.constructor(),時一般都可以,但是如果context時Symbol型別,那麼就會報錯,它不允許被new
Function.prototype.myCall = function(context,...params){
//context ---> 一個物件,我們需要改變的this為context
//this---->就是那個函式
context == null ? context = window : null
//如果傳入的是一個null或者是undefined那麼,context就是window,否則什麼都不做
!/^(object|function)$/.test(typeof context)?context = Object(context):null
let key = Symbol('key');
context[key] = this;
//這個是為context新增一個屬性,屬性值為一個函式(this就是一個函式)
let result = context[key](...params);
//我們執行context這個物件中的一個方法,就是執行了 this這個函式,並且獲得函式執行的返回值
delete context[key];
//最後刪除一個我們新增的那個屬性
return result
//那麼我就需要返回這個函式執行的結果
}
//-----------------驗證--------------------
function fn(x,y){
console.log(this.name);
return x+ y
}
let obj = {
name:'李雲龍'
}
//1.普通使用
fn(10,20) // this---->window,30
//2.使用call
fn.myCall(20,10,20)//傳入的是一個基本型別的值 this--->20 , 30
相關文章
- 手寫JS函式的call、apply、bindJS函式APP
- 手寫系列:call、apply、bind、函式柯里化APP函式
- call仿函式函式
- [手寫系列] Spirit帶你實現防抖函式和節流函式函式
- 手寫JavaScript常用的函式JavaScript函式
- 在建構函式內使用call()或apply()實現繼承函式APP繼承
- js的call函式”原始碼”JS函式原始碼
- 箭頭函式、簡寫函式、普通函式的區別函式
- 遞迴匿名函式手動實現 http_build_query 系統函式遞迴函式HTTPUI
- 手寫CommonJS 中的 require函式JSUI函式
- 手寫一個bind函式(大概)函式
- JavaScript的迭代函式與迭代函式的實現JavaScript函式
- 理解JS函式之call,apply,bindJS函式APP
- MySQL分析函式實現MySql函式
- MySQL排名函式實現MySql函式
- fcntl函式實現dup函式
- [譯] 編寫函式式的 JavaScript 實用指南函式JavaScript
- MySQL函式大全(字串函式,數學函式,日期函式,系統級函式,聚合函式)MySql函式字串
- Go 實現字串首字母大、小寫函式Go字串函式
- python中id()函式、zip()函式、map()函式、lamda函式Python函式
- 去抖函式的實現函式
- bind 函式的實現原理函式
- 巧妙地實現 debugOnly 函式Go函式
- js實現函式過載JS函式
- async 函式的實現原理函式
- Golang實現PHP常用函式GolangPHP函式
- Go實現PHP常用函式GoPHP函式
- Python 擴充之特殊函式(lambda 函式,map 函式,filter 函式,reduce 函式)Python函式Filter
- WPF啟動流程-自己手寫Main函式AI函式
- Function.prototype.callFunction
- 函式中的apply,call入門介紹函式APP
- 類中的__init__()和__call__()函式函式
- 第7章 IF函式 COUNTIF函式 SUMIF函式函式
- MySQL(四)日期函式 NULL函式 字串函式MySql函式Null字串
- 函式實操函式
- (譯) 函式式 JS #2: 函式!函式JS
- 使用函式式方式實現責任鏈模式函式模式
- 使用函式式實現觀察者模式模式函式模式