// call
Function.prototype.call = function(ctx, ...args) {
ctx = ctx || window;
const fnSymbol = Symbol('fn');
ctx[fnSymbol] = this;
ctx[fnSymbol](...args);
delete ctx[fnSymbol];
}
// test
function fn(c, d) {
return this.a + c + d;
}
const obj = {
a: 1
}
fn.call(obj, 2, 3); // 6
// apply
Function.prototype.apply = function(ctx, args) {
ctx = ctx || window;
const fnSymbol = Symbol('fn');
ctx[fnSymbol] = this;
ctx[fnSymbol](...args);
delete ctx[fnSymbol];
}
// test
function fn(c, d) {
return this.a + c + d;
}
const obj = {
a: 1
}
fn.apply(obj, [2, 3]); // 6
// bind
Function.prototype.bind = function(ctx, ...args) {
ctx = ctx || window;
const fnSymbol = Symbol('fn');
ctx[fnSymbol] = this;
return function (){
ctx[fnSymbol](...args);
delete ctx[fnSymbol];
}
}
// test
function fn(c, d) {
return this.a + c + d;
}
const obj = {
a: 1
}
fn.bind(obj, 2, 3); // 6