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