// call
Function.prototype.myCall = function(thisArg, ...args) {
const fn = Symbol('fn') // 声明一个独有的Symbol属性, 防止fn覆盖已有属性
thisArg = thisArg || window // 若没有传入this, 默认绑定window对象
thisArg[fn] = this // this指向调用call的对象,即我们要改变this指向的函数
const result = thisArg[fn](...args) // 执行当前函数
delete thisArg[fn] // 删除我们声明的fn属性
return result // 返回函数执行结果
}
//测试
foo.myCall(obj)
// apply
Function.prototype.myApply = function(thisArg, args) {
const fn = Symbol('fn') // 声明一个独有的Symbol属性, 防止fn覆盖已有属性
thisArg = thisArg || window // 若没有传入this, 默认绑定window对象
thisArg[fn] = this // this指向调用call的对象,即我们要改变this指向的函数
const result = thisArg[fn](...args) // 执行当前函数
delete thisArg[fn] // 删除我们声明的fn属性
return result // 返回函数执行结果
}
//测试
foo.myApply(obj, [])
//bind
Function.prototype.myBind = function(obj){
let self = this;
let args = Array.prototype.slice.call(arguments,1)
return function(){
args = args.concat(Array.prototype.slice.call(arguments))
let fn = Symbol('fn')
obj = obj || window
obj[fn] = self
let result = obj[fn](...args)
delete obj[fn]
return result
}
}
function fn(age,sex){
console.log(this.name + age + sex)
}
let obj1 = {
name:'lhr'
}
console.log(fn.myBind(obj1,18)('男'))//lhr18男
手写实现call和apply
最新推荐文章于 2024-04-29 09:43:58 发布