apply(thisArg) apply(thisArg, argsArray) thisArg 在 func 函數運行時使用的 this 值。請註意,this 可能不是該方法看到的實際值:如果這個函數處於非嚴格模式下,則指定為 null 或 undefined 時會自動替換為指向全局對象,原始值會 ...
apply(thisArg)
apply(thisArg, argsArray)
thisArg
在 func
函數運行時使用的 this
值。請註意,this
可能不是該方法看到的實際值:如果這個函數處於非嚴格模式下,則指定為 null
或 undefined
時會自動替換為指向全局對象,原始值會被包裝。
argsArray
可選
一個數組或者類數組對象,其中的數組元素將作為單獨的參數傳給 func
函數。如果該參數的值為 null
或 undefined
,則表示不需要傳入任何參數。從 ECMAScript 5 開始可以使用類數組對象。瀏覽器相容性請參閱本文底部內容。
返回值
調用有指定 this
值和參數的函數的結果。
1.數組合併用法
const arr1 = ["anan", "zooey"]; const arr2 = [198, 246, 357]; //1.1 apply() arr1.push.apply(arr1, arr2); // console.log(arr1);//['anan','zooey',198,246,357] //1.2call() arr1.push.call(arr1, ...arr2); // console.log(arr1);//['anan','zooey',198,246,357] //1.3 es6 const newArr = [...arr1, ...arr2]; // console.log(newArr);//['anan','zooey',198,246,357]
2.內置函數用法
const num = [2, 5, 3, 6, 9, 0, 99]; //2.1 錯誤用法 let max1 = Math.max(num); // console.log(max1);//NaN //2.2 apply() let max2 = Math.max.apply(null, num); // console.log(max2);//99 //2.3 es6 let max3 = Math.max(...num); // console.log(max3);//99 //2.4 call() let max4 = Math.max.call(null, ...num); // console.log(max4);//99
3.apply鏈接構造器用法
你可以使用 apply 來鏈接一個對象構造器,類似於 Java。(Java的對象構造器用來創建對象,也可以對對象屬性做一些特殊處理,如時間格式化)
在接下來的例子中我們會創建一個全局 Global_Objects/Function
對象的 construct
方法,來使你能夠在構造器中使用一個類數組對象而非參數列表。
個人理解:給全局的Function 類定義一個construct方法,並且在construct方法中根據現有對象創建一個新的對象,利用apply鏈接構造器,返回一個新的對象,此時對全局的Function
對象擁有了一個的 construct
方法,能夠返回類數組對象
註意,這個construct方法是新定義的,不是原本的constructor
定義中描述的類數組對象是下圖的樣子:
//給全局的Function 類定義一個construct方法,並且在construct方法中創建一個新的對象,利用apply鏈接構造器,返回一個新的對象
Function.prototype.construct = function (aArgs) {//Object.create() 靜態方法以一個現有對象作為原型,創建一個新對象
let oNew = Object.create(this.prototype); this.apply(oNew, aArgs); return oNew; }; function MyConstructor() {
//這裡就是對數組進行遍歷,然後封裝成k:v的形式 for (let nProp = 0; nProp < arguments.length; nProp++) { this["property" + nProp] = arguments[nProp]; } } //定義一個數組 let myArray = ["zooey", "Hello world!", "anan"]; let myInstance = MyConstructor.construct(myArray); //列印結果 console.log(myInstance);