摘要:實現(xiàn)使用是這樣轉(zhuǎn)換的生成新的函數(shù),新的執(zhí)行上下文通過在傳入對象中增加調(diào)用方法執(zhí)行被改變,得恢復(fù)原來的值實現(xiàn)在這里,我們看到了一個有趣的現(xiàn)象,在中可以傳入數(shù)組兩大作用改變借用其他對象的方法改變?nèi)绾螌崿F(xiàn)執(zhí)行借用其他對象的方法繼承的實現(xiàn)執(zhí)行能借用
js實現(xiàn)call
// example let obj = { a: 124, b: "ccc" }; function fn(c) { return this.a + this.b + this.c; } // 使用call是這樣轉(zhuǎn)換的 // step 1: 生成新的函數(shù),新的執(zhí)行上下文(通過在傳入對象中增加調(diào)用方法) const obj = { a: 124, b: "ccc", fn: function(c) { return this.a + this.b + this.c; } } // step2: 執(zhí)行 obj.fn(333); let res = obj.fn(333); // step3: obj被改變,得恢復(fù)原來的值 delete obj.fn;
Function.prototype.myCall = function(context) { const newContext = context || window; newContext.fn = this; const args = []; for(let i = 1; i < arguments.length; i++) { args.push(arguments[i]); } const res = newContext.fn(...args); delete newContext.fn; return res; } console.log(fn.myCall(obj, "cccc"));js實現(xiàn)apply
Function.prototype.myApply = function(context, arr) { const newContext = context || window; newContext.fn = this; const args = []; let res; if (!arr) { res = newContext.fn(...args); } else { if (!(arr instanceof Array)) { throw new Error("params must be array"); } result = context.fn(...arr); } delete newContext.fn; return res; } console.log(fn.myApply(obj, ["cccc"]));call & apply
Math.max.apply(null, [3,5,88,2])
在這里,我們看到了一個有趣的現(xiàn)象,在Math.max中可以傳入數(shù)組
call&apply兩大作用:
改變this改變this
借用其他對象的方法
如何實現(xiàn)Function.prototype.bind()
Function.prototype.bind = function(){ var self = this, context = [].shift.apply(arguments); args = [].slice.apply(arguments); return function(){ return self.apply(context, [].concat.apply(args, [].slice.apply(arguments))) }; } //執(zhí)行 var obj = { name: "yyh" } var func = function(a, b, c, d){ console.log(this.name); }.bind(obj, 1, 2); func(3, 4);借用其他對象的方法
繼承的實現(xiàn)
var aFn = function(){ this.name = "yyh" } var bFn = function(){ aFn.apply(this, arguments); } bFn.prototype.getName = function(){ return this.name } //執(zhí)行 var b = new bFn(); console.log(b.getName())
能借用數(shù)組的方法,Obj.array.push, 需要滿足兩個條件
Obj的屬性可存取
length屬性可讀寫
var a = {c:3}; [].push.apply(a, [3,4,5]) console.log(a)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/102043.html
摘要:參考鏈接在中,和是對象自帶的三個方法,都是為了改變函數(shù)體內(nèi)部的指向。返回值是函數(shù)方法不會立即執(zhí)行,而是返回一個改變了上下文后的函數(shù)。而原函數(shù)中的并沒有被改變,依舊指向全局對象。原因是,在中,多次是無效的。 參考鏈接:https://juejin.im/post/59bfe8... 在JavaScript中,call、apply和bind是Function對象自帶的三個方法,都是為了改變...
摘要:用來改變函數(shù)的對象的指向都是用來改變函數(shù)的對象的指向的。后面的參數(shù)是調(diào)用方法的參數(shù)。都可以利用后續(xù)參數(shù)傳參。 用來改變函數(shù)的this對象的指向 都是用來改變函數(shù)的this對象的指向的。 第一個參數(shù)都是this要指向的對象。 后面的參數(shù)是調(diào)用方法的參數(shù)。 都可以利用后續(xù)參數(shù)傳參。 var xw={ name: 小王, gender: 男, age: 24, ...
摘要:硬綁定會大大降低函數(shù)的靈活性,使用硬綁定之后就無法使用像隱式綁定或顯示綁定來修改。如果可以給默認綁定指定一個全局對象和意外的值,那就可以實現(xiàn)和硬綁定相同的效果,同時保留隱式綁定或顯示綁定修改的能力。 JavaScript中硬綁定與軟綁定詳解 JS中硬綁定這種方式可以把this強制綁定到指定的對象(除了使用new時),防止函數(shù)調(diào)用時應(yīng)用默認綁定規(guī)則(非嚴格模式下全局對象-window| ...
在上一篇文章(《javascript高級程序設(shè)計》筆記:Function類型)中稍微提及了一下函數(shù)對象的屬性—this,在這篇文章中有深入的說明: 函數(shù)的三種簡單調(diào)用模式 1 函數(shù)模式 定義的函數(shù),如果單獨調(diào)用,不將其與任何對象關(guān)聯(lián),那么就是函數(shù)調(diào)用模式 function fn(num1, num2) { console.log(this); } // 直接在全局調(diào)用 fn();// w...
你有遇見過給bind返回的函數(shù)做new操作的場景,本篇主要講述的就是實現(xiàn)一下兼容new操作的bind寫法,順便學(xué)習(xí)一下new操作符,為大家提供下參考。 大家可以去看下關(guān)于 JS 中 bind 方法的實現(xiàn)的文章,并給出了實現(xiàn): Function.prototype.myBind=function(thisArg,...prefixArgs){ constfn=this; return...
閱讀 3532·2021-09-27 13:35
閱讀 3571·2019-08-29 17:09
閱讀 2450·2019-08-26 11:30
閱讀 711·2019-08-26 10:32
閱讀 545·2019-08-26 10:23
閱讀 1206·2019-08-26 10:20
閱讀 3161·2019-08-23 15:26
閱讀 3571·2019-08-23 14:33