總結(jié)apply,call和bind方法各自的特點(diǎn)
1.apply:
使用語(yǔ)法:1)函數(shù)名.apply(對(duì)象毅整,[參數(shù)1趣兄,參數(shù)2,參數(shù)3......]);
? ? ? ? ? ? ? ? ? ? 2)方法名.apply(對(duì)象悼嫉,[參數(shù)1艇潭,參數(shù)2,參數(shù)3......]);
?作用:改變this指向戏蔑;
特點(diǎn):傳參需以數(shù)組的形式傳入蹋凝;
2.call:
使用語(yǔ)法:1)函數(shù)名.call(對(duì)象,參數(shù)1总棵,參數(shù)2鳍寂,參數(shù)3.....);
? ? ? ? ? ? ? ? ? ? 2)方法名.call(對(duì)象,參數(shù)1情龄,參數(shù)2迄汛,參數(shù)3.....);
?作用:改變this指向;
特點(diǎn):傳參需按照參數(shù)列表傳入即可骤视;
3.bind方法
使用語(yǔ)法:函數(shù)名.bind(對(duì)象鞍爱,參數(shù)1,參數(shù)2专酗,參數(shù)3.....);用法同call一樣
作用:函數(shù)名.bind()方法,相當(dāng)于是復(fù)制了這個(gè)函數(shù),返回值就是復(fù)制后的一個(gè)函數(shù)
4.call和apply以及bind的異同點(diǎn):
? ?相同點(diǎn):作用相同睹逃,都是改變this指向
? ? 異同點(diǎn):1.傳參列表不同,call和bind的傳參列表相同笼裳,apply的傳參列表略有差異
? ? ? ? ? ? ? ? ? ? ?2.方式不同:call和apply相當(dāng)于調(diào)用唯卖,而bind是復(fù)制了一份
注意:無(wú)論是apply還是call或者是bind中第一個(gè)參數(shù)不傳,或者是傳的是null,那么函數(shù)中的this都是window
例1:
//創(chuàng)建一個(gè)構(gòu)造函數(shù)Person
function Person(name,sex,age){
? ? ?this.name = name;
}
Person.prototype.sum = function(x,y){
? ? ?console.log((x+y)+"====>"+this.id);
}
function ?Student(name,id){?
? ? //這里將Person構(gòu)造函數(shù)的this指向改為Student
? ?//用法1:使用apply來(lái)改變this指向:傳參列表是數(shù)組形式
? ? ? Person.apply(Student,[name]); ?
? ? //用法2:使用call來(lái)改變this指向:傳參以參數(shù)列表傳入
? ? ?? Person.call(Student,name);
? ? ? ?this.id = id;
}
//這是Person構(gòu)造函數(shù)的實(shí)例化對(duì)象
var ?per = new Person("小簡(jiǎn)");
//這是Student構(gòu)造函數(shù)的實(shí)例化對(duì)象
var stu = new Student("小明","01");
//改變方法的this指向
//用法1:apply使用
per.hello.apply(Stu,[10,20]);
//用法2:call使用
per.hello.call(Stu,10,20);?