call
- 对原型链和继承的知识比较熟悉
- call是用来改变函数内部this
简单的案例
var obj = {name:'zxx',age:18}
function cc(){
console.log(this.name);
}
cc.call(obj)
- 这里,我们可以看到函数cc的this指向了对象obj中的name。
原理
- 其实就是在Function.prototype注册了一个call方法,并且这个函数通过调用call方法,实现对象能够调用函数,实现了this的隐式绑定。
实现代码
Function.prototype.myCall=function(ctx){
ctx = Object(ctx) || window;
let args = [...arguments].slice(1);
let fn = Symbol()
ctx[fn] = this;
let result = ctx[fn](...args);
delete ctx.fn;
return result;
}
apply
- apply和call差距只在于传入的第二个参数不同,apply是一个数组。
- 因此我们别的步骤都可以和call一致,只需要改变传入多余的参数
Function.prototype.myApply = function(ctx){
ctx = Object(ctx) || window
//传进来的是一个二维数组,我们处理成为一位数组
//别的步骤都不需要改变
let args = [...arguments].slice(1)[0]
let fn = Symbol()
ctx[fn] = this
let result = ctx[fn](...args)
delete ctx.fn
return result
}