Function.prototype.myCall = function (ctx, ...argu) {
// null和undefined指向的是全局
ctx = ctx === null || ctx === undefined ? globalThis : Object(ctx)
// 通过Symbol拿去一个唯一属性过渡,避免属性覆盖
const key = Symbol('abc')
// 保存当前this
const fn = this
// 给当前传入的值赋值
Object.defineProperty(ctx, key, {
enumerable: false, // 不可枚举
value: fn
})
// 调用函数拿到返回值
const result = ctx[key](...argu)
// 删除添加的属性,避免造成属性污染
delete ctx[key]
// 返回当前函数调用的返回值
return result
}
function foo(a, b) {
console.log(this);
const num = this.number ?? 0
return a + b + num
}
const obj = {
number:10
}
const c = foo.myCall(obj, 1, 4)
console.log(c);
模拟原生js的call函数实现过程
最新推荐文章于 2024-11-12 11:19:19 发布
文章详细介绍了如何重写JavaScript的Function.prototype.myCall方法,通过设置上下文、避免属性覆盖以及调用函数并恢复原始状态,实现函数在特定对象上的调用。示例中展示了foo函数在obj对象上的应用,返回了正确的结果。
摘要由CSDN通过智能技术生成