call()和apply()
call和apply是为了动态改变this而出现的,当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其它对象的方法来操作。
用的比较多的情况是在类数组转化数组:http://wangjingyi.iteye.com/blog/2197626
call方法:
语法:call(thisObj,Object)
定义:调用一个对象的一个方法,以另一个对象替换当前对象。
说明:call方法可以用来代替另一个对象调用一个方法。call方法可将一个函数的对象上下文从初始的上下文改变为由thisObj指定的新对象。
如果没有提供thisObj参数,那么Global对象被用作thisObj。
function sayColor(sPrefix,sSuffix) { alert(sPrefix + this.color + sSuffix); }; var obj = new Object(); obj.color = "blue"; //第二个和第三个参数是字符串,最终弹出:The color is blue, a very nice color indeed sayColor.call(obj, "The color is ", "a very nice color indeed.");
apply方法:
语法:apply(thisObj,[argArray])
定义:应用某一对象的一个方法,用另一个对象替换当前对象。
说明:如果argArray不是一个有效的数组或者不是arguments对象,那么将导致一个TypeError。
如果没有提供argArray和thisObj任何一个参数,那么Global对象将被用作thisObj,并且无法被传递任何参数。
function sayColor(sPrefix,sSuffix) { alert(sPrefix + this.color + sSuffix); }; var obj = new Object(); obj.color = "blue"; //第二个参数是由两个字符串构成的数组,最终弹出:The color is blue, a very nice color indeed sayColor.apply(obj, new Array("The color is ", "a very nice color indeed."));
共同点:作用完全一样
不同点:接受参数的方式不太一样,call需要把参数按顺序传递进去,而apply则是把参数放在数组里。
http://www.zhihu.com/question/20289071
http://www.w3school.com.cn/js/pro_js_inheritance_implementing.asp