// call/apply/bind的原生js实现
// call和apply都是一次性且立即调用的
// bind是永久绑定到一个新函数,并不会立即调用
// 原生js实现bind函数
// 所有的函数都要有bind方法,所以要定义在Function的原型对象上
Function.prototype.myBind = function(objThis,...params){
// objThis是要绑定的this对象,...params是因为参数数量不确定才用解构语法
const thisFn = this;//当前调用的函数,例如fn.myBind()就把fn保存到thisFn
let funcForBind = function(...secondParams){ // 要返回的函数
// 判断函数是否是用new function生成的
const isNew = this instanceof funcForBind
const thisArg = isNew?this:objThis //this的指向
// 绑定好this和参数返回到外层,暂时用call绑定,call也可以原生实现
return thisFn.call(thisArg,...params,...secondParams)
}
// 绑定原型
funcForBind.prototype = Object.create(thisFn)
return funcForBind //返回绑定好的函数
}
// 原生js实现call函数
Function.prototype.myCall = function(objThis,...params){
// 先判断objThis,如果未传入则将this指向window
if(objThis===null || objThis==undefined){
objThis = window
}
const specialMethod = Symbol('anything');//不重复的方法
// 将这个不重复的方法作为objThis的一个属性,属性值就是要绑定this的那个函数
objThis[specialMethod] = this // this就是需要绑定this的函数
// 调用函数并且将结果返回
let result = objThis[specialMethod](...params)
// call是一次性的,所以调用完之后要删除这个新增加的属性
delete objThis[specialMethod]
return result // 返回结果
}
// 原生js实现apply函数
// apply函数与call函数基本一致的,只是传入的参数是个数组
// 除了这两行,都与call函数一致
Function.prototype.myApply = function(objThis,arr){
// ....
let result = objThis[specialMethod](...arr) // 解构传入的数组
}
Javascript原生实现call/apply/bind
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 1、基本使用 call、apply、bind都是改变this的指向 call apply bind 2、手动实现 ...
- 我们知道在javascript中call和apply以及bind都可以改变this指向,那么它们是怎么实现的呢?彼...
- call() 方法在使用 一个指定的 this 值和若干个指定的参数值 的前提下 调用 某个函数或方法。 appl...
- 【call】 call() 方法在使用一个指定的 this 值和若干个指定的参数值的前提下调用某个函数或方法。 举...