一、apply:方法能劫持另外一個(gè)對(duì)象的方法,繼承另外一個(gè)對(duì)象的屬性。
Function.apply(obj, args) 方法能接收兩個(gè)參數(shù)
obj:這個(gè)對(duì)象將代替Function類(lèi)里this對(duì)象
args:這個(gè)是數(shù)組,它將作為參數(shù)傳給Function(args-->arguments)
// 定義一個(gè)人類(lèi)
function Person(name, age) {
this.name = name;
this.age = age;
}
// 定義一個(gè)學(xué)生類(lèi)
function Student(name, age, grade) {
Person.apply(this, arguments);
this.grade = grade;
}
// 實(shí)例化一個(gè)學(xué)生類(lèi)
var s = new Student('Jon', 18, '大一');
console.log(s.name, s.age, s.grade);
// Jon 18 大一
學(xué)生類(lèi)里面沒(méi)有給name和age屬性賦值,為什么又存在這兩個(gè)屬性的值呢?這個(gè)就是apply的神奇之處。
分析:
Person.apply(this, arguments);
this:在創(chuàng)建對(duì)象在這個(gè)時(shí)候代表的是Student
arguments:是一個(gè)數(shù)組,也就是['Jon', 18, '大一'];
即用Student去執(zhí)行Person這個(gè)類(lèi)里面的內(nèi)容,在Person這個(gè)類(lèi)里面存在this.name等之類(lèi)的語(yǔ)句,這樣就將屬性創(chuàng)建到了Student對(duì)象里面。
二、apply的一些其他巧妙用法
在調(diào)用apply方法的時(shí)候,第一個(gè)參數(shù)是對(duì)象this,第二個(gè)參數(shù)是一個(gè)數(shù)組集合,在調(diào)用Person的時(shí)候,方法需要的不是一個(gè)數(shù)組,而是一個(gè)一個(gè)的參數(shù)。apply的一個(gè)巧妙的用處,就是可以將一個(gè)數(shù)組轉(zhuǎn)換為參數(shù)列表([param1, param2, param3] 轉(zhuǎn)換為 param1, param2, param3) 。如果用程序?qū)崿F(xiàn)數(shù)組的每一個(gè)項(xiàng),轉(zhuǎn)換為參數(shù)的列表,可能都得費(fèi)一會(huì)功夫。借助apply的這點(diǎn)特性可以提高效率。
1.Math.max 可以實(shí)現(xiàn)得到數(shù)組中最大的一項(xiàng)
因?yàn)镸ath.max 參數(shù)里面不支持Math.max([param1,param2]) 也就是數(shù)組
但是它支持Math.max(param1,param2,param3…),所以可以根據(jù)剛才apply的那個(gè)特點(diǎn)來(lái)解決:
var max = Math.max.apply(null, array);
這樣就可以得到一個(gè)數(shù)組中最大的一項(xiàng)(apply會(huì)將一個(gè)數(shù)組轉(zhuǎn)換為一個(gè)參數(shù)接一個(gè)參數(shù)的傳遞給方法)
這塊在調(diào)用的時(shí)候第一個(gè)參數(shù)給了一個(gè)null,因?yàn)闆](méi)有對(duì)象去調(diào)用這個(gè)方法,直接傳遞了一個(gè)null。