手写 call apply bind
call
Function.prototype.my_call = function (context, ...args) {
if (typeof context === 'undefined' || context === null) {
context = window
}
context.fn = this
const result = context.fn(...args) // 也可以不定义args直接使用arguments,但是arguments是不推荐的方法了
delete context.fn
return result
}
apply
Function.prototype.my_apply = function (context, args) {
if (typeof context === 'undefined' || context === null) {
context = window
}
context.fn = this
const result = context.fn(args)
delete context.fn
return result
}
bind
Function.prototype.my_bind = function (context, ...args) {
if (typeof context === 'undefined' || context === null) {
context = window
}
const fn = this
return function () {
return fn.apply(context, args)
}
}
问题:如果原来的对象本来就有fn这个成员变量怎么办?
解决方案: 以call为例
Function.prototype.my_call = function (context, ...args) {
if (typeof context === 'undefined' || context === null) {
context = window
}
const fn = new Symbol('fn') //利用Symbol独一无二的特性
context[fn] = this
const result = context[fn](...args) // 也可以不定义args直接使用arguments,但是arguments是不推荐的方法了
delete context[fn]
return result
}