js中怎麼改變this指向
阿新 • • 發佈:2019-01-24
/* * call和apply可以借用其他物件的方法去操作指定的物件。* * 通常例項的方法內部在實現時,都會使用this來獲取對應的例項,* 即這些方法內部操作的都是this。* * 如果一個方法內部沒有操作this,那麼是無法借用成功的。* * 借用一個方法操作我們指定的物件,如何操作需要看這個方法具體的功能。* */ /*// 給所有的陣列新增一個遍歷列印值的方法 conArr Array.prototype.conArr = function() { // 這裡通過this,可以獲取呼叫conArr方法的陣列, // 那麼誰呼叫這個方法,我們就列印誰的值。 var i, len; for (i = 0, len = this.length; i < len; i++) {console.log(this[i]); } }; // 陣列呼叫這個,依次列印1、2、3 var arr = [1,2,3]; arr.conArr(); var arr2 = ['a','b','c']; arr2.conArr();*/ /*------------------------------------------*/ // 這是一個偽陣列物件 var obj = { 0: 'abc', 1: 'qwe', 2: 'wsx', 3: 'edc', name: '肥貓', age: '3', length: 5 }; /*// 偽陣列不是真陣列,無法呼叫真陣列的那些方法。//obj.conArr();// 但是我們還想利用陣列的conArr方法,列印偽陣列中下標儲存的資料。// conArr方法有一個特點,它內部操作的是this,// 如果我們能夠讓這個this指向obj,那麼conArr就可以操作obj了。//Array.prototype.conArr.call(obj); [].conArr.call(obj); // 既然可以通過call借用陣列的conArr方法,那麼其他方法是否可行呢?// 借用push方法給偽陣列新增新值[].push.call(obj, 10, 20, 30, 40, 50); console.log(obj); // 借用pop刪除偽陣列中最後一個值[].pop.call(obj); console.log(obj);*/// 借用slice擷取偽陣列的一部分,得到一個新陣列 //console.log([].slice.call(obj, 1)); // 如果一個偽陣列需要多次使用真陣列的那些方法,可以考慮把偽陣列轉化為真陣列 console.log([].slice.call(obj)); // slice在擷取的時候,只會擷取存在的值 console.log([].concat.apply([], obj)); // apply會根據length平鋪得到所有的值傳給concat