Function.prototype.call = function call(context, ...params) {
// this->fn context->obj params->[10,20]
//目的:把fn{this}执行,让其this指向obj{context},并且把10/20{params}传递给他,最后把fn执行的结果返回
//额外处理:如果context是原始值类型,是无法设置属性的,此时我们需要把原始值类型变为对象类型
if (context == null) context = window;
if (typeof context !== "object" && typeof context !== "function") context = Object(context); //只有对象类型的值加属性才有用,所以判断一下是不是对象类型的,如果context(obj)不是对象类型的就用Object(context)转成对象类型的
let key = Symbol('KEY'),
result; //接收返回值
context[key] = this; //给obj加个属性(唯一值)等于fn []和.是一个意思
result = context[key](...params);
delete context[key]; //用完删掉
return result;
};
const fn = function fn(x, y) {
console.log(this);
return x + y;
};
let obj = {
name: '哈哈'
};
// fn(10, 20); //this->window
// obj.fn(10,20);//Uncaught TypeError:obj.fn is not a function
let result = fn.call(obj, 10, 20); //this->objx->10 y->20
手撕内置call / 如何手写内置call
最新推荐文章于 2024-07-14 15:54:59 发布