分析:
- 将函数设为对象的属性
- 执行&删除这个函数
- 指定this到函数并传入给定参数执行函数
- 如果不传入参数,默认指向为 window
Function.prototype.myCall = function (ctx, ...args) {
// call的第一个参数为null/undefined时,this则指向全局window(这里是浏览器环境,node环境则不是window),其余则转为对象
ctx = (ctx === null || ctx === undefined) ? window : Object(ctx);
// 这里之所以采用symbol,是为了避免和对象的属性重名
const func = Symbol('func');
// 优化打印this的console值
Object.defineProperty(ctx, func, {
enumerable: false,
value: this,
})
const result = ctx[func](...args);
delete ctx[func];
return result;
}