使用 ES6+ 实现这三个方法其实非常简单,本文就来挑战一下,如果不适用 ES6+ 的情况下如何实现这三个方法
难点: 不能使用扩展运算符(…)该如何接收参数和传入参数
至于这三个方法有什么区别可以阅读我之前的这篇文章 call()-apply()-bind()方法有什么不同?
apply
就不多说废话了,直接看代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| Function.prototype.myApply = function (_this, args) { try { _this = _this || window _this['#function#'] = this if (!args) { return _this['#function#']() } else { var params = JSON.stringify(args) params = params.slice(1, params.length - 1) return new Function('_this', 'return _this["#function#"](' + params + ')')(_this)
var params = [] for (var i = 1; i < arguments.length; i++) { params.push('arguments[' + i + ']') } return eval('_this["#function#"](' + params + ')') } } finally { delete _this['#function#'] } }
|
call
由于前面以及实现了 myApply
方法,再 myCall
即可直接调用,如果要完整写一个 myCall
也只是增加代码冗余而已
1 2 3 4 5 6 7 8 9
| Function.prototype.myCall = function (_this) { _this = _this || window var params = [] for (var i = 1; i < arguments.length; i++) { params.push(arguments[i]) } return this.myApply(_this, params) }
|
bind
如上,可以继续复用已经封装好的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| Function.prototype.myBind = function (_this) { _this = _this || window var self = this var params = [] for (var i = 1; i < arguments.length; i++) { params.push(arguments[i]) } return function () { for (var i = 0; i < arguments.length; i++) { params.push(arguments[i]) } return self.myApply(_this, params) } }
|
总结
以上就是本文的全部内容,可能会存在一些小瑕疵,希望各位读者留言评论或优化