下面这段代码输出结果是什么呢?
Function.prototype.san = function () {
return Function.prototype.call.bind(this);
};
console.log(Array.prototype.push.san()([], 1, 2));
答案:
2
解析:
在做这道题之前,一定要保证自己明白什么是原型,什么是call
、apply
、bind
,如果不太明白或者没有听说过的话,那赶快去恶补一下吧,接下来进入正题,很多同学可能没有见过将call和bind这两个关键字一块使用的,改变this指向用一种方法不就可以达到想要的效果了吗,这段代码简直是魔鬼套娃啊(第一次做的时候我也是这么想的(*^▽^*
),其实不然,如果简化一下上面得代码,变为这样,是不是就好理解一些了呢?
var san = Function.prototype.call.bind(Array.prototype.push);
console.log(san([], 1, 2));
可能有些同学还是不懂,那么来看一下一个实例,给定一个字符串,然后将其转化为一个用指定字符连接的新字符串,如何实现?看起来非常简单,上手一发join()
:
console.log('abc'.join('|'));
结果报错了:
TypeError: “abc”.join is not a function
新人(比如我)还在傻眼:字符串不是特殊的数组吗,那就可以调用数组的一些方法啊,而且本地编辑器并没有报错,老手已经开始使用原型来借助方法了:
console.log(Array.prototype.join.call('abc', '|'));
运行无误,看到这里是不是对上面的题有了思路了?首先将Array
原型上的push
方法利用bind
方法将this
绑定到给出的数组上形成一个新的函数,然后在通过call
方法绑定到Function
上,这样就可以实现原型对象方法的调用。
参考博客:https://www.cnblogs.com/gaoht/p/10978751.html