ES6自己实现
call
1 | Function.prototype.call2 = function(context,...list) { |
apply
1 | Function.prototype.apply2 = function(context,arr) { |
bind1
1 | Function.prototype.bind1 = function(context, ...arr1) { |
bind2
1 | Function.prototype.bind2 = function(context, ...arr1) { |
有什么问题?
前面我们用的 eval 方式可以用 ES6 的解决还存在的一些问题,有没有注意到,这段代码是有问题的。1
context.fn = this;
假如对象在被 call 调用前,已经有 fn 属性怎么办?
ES6 中提供了一种新的基本数据类型,Symbol,表示独一无二的值,另外,Symbol 作为属性的时候,不能使用点运算符。所以再加上 ES 的 rest 剩余参数替代 arguments 遍历的工作就有:
1 | Function.prototype.newCall = function (context,...params) { |
apply 和 call 的实现原理,基本类似,区别在于 apply 的参数是以数组的形式传入
1 | Function.prototype.newApply = function(context, parameter) { |