电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

原生js如何實現call,apply以及bind

瀏覽:133日期:2024-04-01 09:39:02
1、實現call

步驟:

將函數設為對象的屬性; 指定this到函數,并傳入給定參數執行函數; 執行之后刪除這個函數; 如果不傳入參數,默認指向window;

Function.prototype.mycall = function (context, ...args) { //判斷是否為函數,如果不是函數,則報錯 if (typeof this !== 'function') {throw new Error('不是函數'); } context = context || window; context.fn = this; const res = context.fn(...args); delete context.fn; return res;}

測試代碼:

var name = '李輝', age = 25;var obj = { name: '周果', objAge: this.age, myFun: function (fm, to) {console.log(`名字:${this.name},年齡:${this.age},來自:${fm},去往:${to}`) }};var person = { name: '弟弟', age: 12,};Function.prototype.mycall = function (context, ...args) { //判斷是否為函數,如果不是函數,則報錯 if (typeof this !== 'function') {throw new Error('不是函數'); } context = context || window; context.fn = this; const res = context.fn(...args); delete context.fn; return res;}obj.myFun.mycall(person, '成都', '仁壽'); //名字:弟弟,年齡:12,來自:成都,去往:仁壽2、實現apply

Function.prototype.myApply = function (context, ...args) { //判斷是否為函數,如果不是函數,則報錯 if (typeof this !== 'function') {throw new Error('不是函數'); } context = context || window; context.fn = this; args = args && args[0] || []; const result = context.fn(...args); delete context.fn; return result;}

測試代碼:

obj.myFun.myApply(person, ['成都', '仁壽']); //名字:弟弟,年齡:12,來自:成都,去往:仁壽3、實現bind

bind()方法主要就是將函數綁定到某個對象,bind()會創建一個函數,函數體內的this對象的值會被綁定到傳入bind()中的第一個參數的值。

方法1:使用apply

Function.prototype.myBind = function () { let self = this; //保存原函數 let context = [].shift.call(arguments); //保存需要綁定的this上下文 let args = [...arguments]; //將傳入的剩余參數轉換成數組 return function () { //返回一個新的函數self.apply(context,[].concat.call(args,[...arguments])); }}

ES6簡化一下:

Function.prototype.myBind = function (context, ...args1) {return (...args2) => { //返回箭頭函數, this綁定調用這個方法的函數對象 context = context || window; return this.apply(context, args1.concat(args2));//合并參數} }方法2:不使用call以及apply

將上面的代碼和js手寫實現apply的代碼合并一下:

Function.prototype.myBind = function (context, ...args1) { return (...args2) => { //返回箭頭函數, this綁定調用這個方法的函數對象context = context || window;context.fn = this;const args = args1.concat(args2);const res = context.fn(...args);delete context.fn;return res; }}

測試代碼:

obj.myFun.myBind(person, '成都', '仁壽')();//名字:弟弟,年齡:12,來自:成都,去往:仁壽

以上就是原生js如何實現call,apply以及bind的詳細內容,更多關于js實現call,apply以及bind的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
主站蜘蛛池模板: 潜水搅拌机-双曲面搅拌机-潜水推进器|奥伯尔环保 | 烟气换热器_GGH烟气换热器_空气预热器_高温气气换热器-青岛康景辉 | 道达尔润滑油-食品级润滑油-道达尔导热油-合成导热油,深圳道达尔代理商合-深圳浩方正大官网 | 橡胶膜片,夹布膜片,橡胶隔膜密封,泵阀设备密封膜片-衡水汉丰橡塑科技公司网站 | 活性炭厂家-蜂窝活性炭-粉状/柱状/果壳/椰壳活性炭-大千净化-活性炭 | 氧化锆纤维_1800度高温退火炉_1800度高温烧结炉-南京理工宇龙新材料股份有限公司 | 淋巴细胞分离液_口腔医疗器材-精欣华医疗器械(无锡)有限公司 | 槽钢冲孔机,槽钢三面冲,带钢冲孔机-山东兴田阳光智能装备股份有限公司 | 广州物流公司_广州货运公司_广州回程车运输 - 万信物流 | 四川职高信息网-初高中、大专、职业技术学校招生信息网 | 武汉创亿电气设备有限公司_电力检测设备生产厂家 | 压力控制器,差压控制器,温度控制器,防爆压力控制器,防爆温度控制器,防爆差压控制器-常州天利智能控制股份有限公司 | 安徽净化工程设计_无尘净化车间工程_合肥净化实验室_安徽创世环境科技有限公司 | 皮带机_移动皮带机_大倾角皮带机_皮带机厂家 - 新乡市国盛机械设备有限公司 | 黄石妇科医院_黄石东方女子医院_黄石东方妇产医院怎么样 | 储气罐,真空罐,缓冲罐,隔膜气压罐厂家批发价格,空压机储气罐规格型号-上海申容压力容器集团有限公司 | 工业铝型材生产厂家_铝合金型材配件批发精加工定制厂商 - 上海岐易铝业 | 【星耀裂变】_企微SCRM_任务宝_视频号分销裂变_企业微信裂变增长_私域流量_裂变营销 | 无味渗透剂,泡沫抑尘剂,烷基糖苷-威海威能化工有限公司 | 好杂志网-首页| 魔方网-培训咨询服务平台 | 地磅-电子地磅维修-电子吊秤-汽车衡-无人值守系统-公路治超-鹰牌衡器 | 压片机_高速_单冲_双层_花篮式_多功能旋转压片机-上海天九压片机厂家 | 科昊仪器超纯水机系统-可成气相液氮罐-美菱超低温冰箱-西安昊兴生物科技有限公司 | 丝杆升降机-不锈钢丝杆升降机-非标定制丝杆升降机厂家-山东鑫光减速机有限公司 | 空压机商城|空气压缩机|空压机配件-压缩机网旗下商城 | 玉米深加工机械,玉米加工设备,玉米加工机械等玉米深加工设备制造商-河南成立粮油机械有限公司 | 阁楼货架_阁楼平台_仓库仓储设备_重型货架_广州金铁牛货架厂 | 面粉仓_储酒罐_不锈钢储酒罐厂家-泰安鑫佳机械制造有限公司 | DWS物流设备_扫码称重量方一体机_快递包裹分拣机_广东高臻智能装备有限公司 | 知名电动蝶阀,电动球阀,气动蝶阀,气动球阀生产厂家|价格透明-【固菲阀门官网】 | 上海瑶恒实业有限公司|消防泵泵|离心泵|官网 | 青岛球场围网,青岛车间隔离网,青岛机器人围栏,青岛水源地围网,青岛围网,青岛隔离栅-青岛晟腾金属制品有限公司 | Safety light curtain|Belt Sway Switches|Pull Rope Switch|ultrasonic flaw detector-Shandong Zhuoxin Machinery Co., Ltd | 卓能JOINTLEAN端子连接器厂家-专业提供PCB接线端子|轨道式端子|重载连接器|欧式连接器等电气连接产品和服务 | 深圳宣传片制作_产品视频制作_深圳3D动画制作公司_深圳短视频拍摄-深圳市西典映画传媒有限公司 | 深圳南财多媒体有限公司介绍| Maneurop/美优乐压缩机,活塞压缩机,型号规格,技术参数,尺寸图片,价格经销商 | 济南品牌设计-济南品牌策划-即合品牌策划设计-山东即合官网 | 小港信息港-鹤壁信息港 鹤壁老百姓便民生活信息网站 | 微信聊天记录恢复_手机短信删除怎么恢复_通讯录恢复软件下载-快易数据恢复 |