关于[].slice.call()
2020-06-26 本文已影响0人
苦庭
https://stackoverflow.com/questions/2125714/explanation-of-slice-call-in-javascript
有时候在看别人代码的时候总会看到一种写法[].slice.call(obj)
,这种写法其实是等价于Array.prototype.call(obj)
的,两者的区别只在于前者会创建一个冗余的空数组,而后者不会。
它的作用是把slice方法”借“过来给obj环境下使用。
然后来说说原理。
object1 = {
name: 'Frank',
greet() {
alert(`Hello ${this.name}`);
}
};
object2 = {
name: 'Andy'
};
// Note that object2 has no greet method,
// but we may "borrow" from object1:
object1.greet.call(object2); // Will show an alert with 'Hello Andy'
这里是一个“借”别人方法的例子。
里面object1有一个greet()方法,object2想自己也能够有一个greet()的方法,但是又不想费劲自己撸一个。
因此最好的方法就是,object1.greet()
正常调用的同时,通过call()
来改变闭包环境。
- 让我享有object2的环境
- 让我运行object.greet()。因为这时候我们的环境从object1变成了object2,所以就相当于把object1的greet()方法“借”到object2中使用了。