前几天面试字节跳动,面试官让我封装bind,然后直接回复太难了没有做,后来仔细想一下其实并不是很难...
无论是封装什么函数大家都要先明确一点,这个函数的功能是什么?把功能都考虑到位了实现自然也就不是什么难事了
bind功能:改变this指向返回一个函数,调用这个函数改变this
封装代码:
//简易版封装bind
Function.prototype.myBind = function(context) {
var self = this;
return function() {
return self.apply(context, arguments);
}
}
function foo(){
console.log(this.a)
}
var obj = {
a:4
}
var bar = foo.myBind(obj);
bar();//4
怎么样是不是so easy?如果你感觉很简单就看下面包含容错机制、加入原型的复杂封装
Function.prototype.MyBind = function (target){
var self = this;
var _arg1 = [].slice.call(arguments,1);
var Temp = function (){};
var F = function (){
var _arg2 = [].slice.call(arguments,0)
self.apply(this instanceof Temp ? this : target || window ,_arg1.concat(_arg2) )
}
Temp.prototype = self.prototype;
F.prototype = new Temp();
return F;
}