JS Call()與Apply()
ECMAScript規範給所有函數都定義了Call()與apply()兩個方法,call與apply的第一個參數都是需要調用的函數對象,在函數體內這個參數就是this的值,剩餘的參數是需要傳遞給函數的值,call與apply的不同就是call傳的值可以是任意的,而apply傳的剩餘值必須爲數組。
例如:function add(a, b) { return a + b; }
function sub(a, b) { return a - b; }
/*apply用法
* var a1 = sub.apply(add, [4, 2]);
*var a2= add.apply(sub, [4, 2]);
*/
var a1 = sub.call(add, 4, 2);
var a2= add.call(sub, 4, 2);
輸出:a1=2 a2=6
感覺還是有意未盡,更有意思的還在下面
js總是認爲他是萬能的,既然高級語言會繼承,我js也不能示弱:JS模仿繼承
function fun1() {
this.a = 123;
this.add = function () { return this.a }
}
function fun2() {
this.a = 456;
}
var f1=new fun1()
var f2=new fun2()
var a = f1.add.call(f2); // a輸出的是456
這裏就是把啊f1的方法拿給f2來使用,f2便可以使用f1中所有的方法,這不正是高級語言中繼承的概念嘍。當然根據綜上可擴展出多繼承,使用多個call便可以實現多繼承
function fun1() {
this.add = function () { return this.a }
}
function fun2() {
this.sub = function () { return this.a-this.b }
}
function fun3() {
this.a = 10;
this.b = 2;
fun1.call(this);
fun2.call(this);
}
var f3 = new fun3()
alert(f3.add());
alert(f3.sub());如此,想要繼承誰就可以繼承誰,我js天下無敵 O(∩_∩)O哈哈~
來源:http://www.cnblogs.com/itstone/archive/2012/07/23/call.html
補充一點:call(),apply(),修改作用域鏈
funtion a(){
this.name = "a";
}
a();
name值就是window中的name
var divObj = $("#example");
a.call(divObj);
name值就是divObj中的name