好像很多大厂都喜欢考 call/apply/bind 内置函数的模拟实现。
今天自己思量了一番,这个考点确实有料。
首先 call/apply/bind 三者的用法要求你对 this 有基础的理解;
其次模拟的时候你需要理解其他情况下 this 的用法(Javascript 的 this 用法 - 阮一峰的网络日志);
而且还会涉及到 js 对象原型、继承,以及 arguments 等考验“内功”的知识点。
既然这么有料,我就自己实现了一个简单的 call 函数模拟(其他的均可由此举一反三):
// 声明一个父对象
var person = function (name) {
this.name = name;
}
// 原型式继承,拓展 person 对象的 say 方法
person.prototype.say = function () {
console.log('Hi~I am ', this.name);
}
// 实例化一个子对象
var a = new person('aaa');
// call 模拟函数 call2 的实现
Function.prototype.call2 = function (obj) {
obj.fn = this; // this 指的是调用 call2 的函数,该例子指的是 a.say
obj.fn()
delete obj.fn;
}
console.log(a.say.call2({
name:'bbb'
}))
// 跟 call 调用得出的结果一样:log ‘Hi~I am bbb’