call()方法和aply()方法的作用就是改变调用的上下文。
var Obj={
name:"lili",
eat:function(food){
alert(this.name+"爱吃"+food);
}
}
var newObj={
name:"Liuxin"
}
Obj.eat.call(newObj,food2);
Obj.eat.apply(newObj,[food2]);
这些等价于后者newObj调用Obj里的eat方法,改变了这个方法里的上下文。
如果newObj不传的话就等价于是Global在调用该方法。
几个特殊的例子
Array.apply(null,{lenth:5})
apply有个奇怪的地方,当第二个参数是一个带有length属性的对象时,会当成一个数组使用
所以Array.apply(null,{length:4})生成[undefined,undefined,undefined,undefined]
相当于Array.apply(null,[undefined,undefined,undefined,undefined])
apply()
的第一个参数是对象,第二个参数是数组,作为参数列表。
然后其实第二个参数只要是个类数组对象就可以了,比如 {length: 5}
就可以看作一个类数组对象,长度是 5,每个元素,比如 v[0]
是 undefined
。
所以,Array.apply(null, { length: 5})
相当于
Array(undefined, undefined, undefined, undefined, undefined)
call和apply可以实现继承,这样的代码能更好的让方法得到更好的公用。