Function.prototype.MyCall = function (target) { var self = target || window self.fn = this var args = [].slice.call(arguments, 1) const result = self.fn(...args) delete self.fn return result }
Function.prototype.MyBind1 = function (target) { var self = this var args = [].slice.call(arguments, 1) var f = function () { return self.apply(target || window, args) } return f }
加强版 解决的调用传参的问题 但是还有函数指针指向的问题
1 2 3 4 5 6 7 8 9
Function.prototype.MyBind2 = function (target) { var self = this var args = [].slice.call(arguments, 1) var f = function () { var _arg = [].slice.call(arguments, 0) return self.apply(target || window, args.concat(_arg)) } return f }
终极版
1 2 3 4 5 6 7 8 9 10 11 12
Function.prototype.MyBind3 = function (target) { var self = this var args = [].slice.call(arguments, 1) var temp = function () { } var f = function () { var _arg = [].slice.call(arguments, 0) return self.apply(thisinstanceof temp ? this : (target || window), args.concat(_arg)) } temp.prototype = self.prototype f.prototype = newtemp() return f }