最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Vue數(shù)據(jù)響應思路之數(shù)組

 更新時間:2018年11月06日 13:46:31   作者:邊城少年_  
這篇文章主要介紹了淺談Vue數(shù)據(jù)響應思路之數(shù)組,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

之前梳理Vue數(shù)據(jù)響應思路 時沒有考慮數(shù)組的情況。

js 中數(shù)組有很多實例方法,其中有一部分會改變數(shù)組本身的值,比如 push pop shift unshift 等,這些方法被稱為變異方法,這些變異方法也是 Vue 開發(fā)中常用的數(shù)組操作方法。那么要實現(xiàn)對數(shù)組的觀測,首先要考慮的就是如何截獲這些變異方法的調(diào)用。

簡單來說,Vue 是通過保持這些數(shù)組變異方法原有功能不變的前提下,對其功能進行擴展來實現(xiàn)攔截的。具體怎么操作,可以先看一下例子:

function add10(num) {
  return num + 10
}
console.log(add10(5)) // 15

const originalAdd10 = add10
add10 = function(num) {
  console.log('截獲了add10操作')
  return originalAdd10(num)
}
console.log(add10(5)) // '截獲了add10操作'
           // 15

該例中,首先使用變量 originalAdd10 緩存 add10 函數(shù),再重新定義 add10 函數(shù),在重新定義的函數(shù)體里就可以執(zhí)行額外增加的功能,比如上例中的 console.log('截獲了add10操作'),然后執(zhí)行緩存的 add10 函數(shù)即 originalAdd10,并將結(jié)果返回,原理大抵如此。

那么,具體可實現(xiàn)如下:

const mutationMethods = [
 'push',
 'pop',
 'shift',
 'unshift',
 'splice',
 'sort',
 'reverse'
]
const arrayMethods = Object.create(Array.prototype)
const arrayProto = Array.prototype

mutationMethods.forEach(method => {
 arrayMethods[method] = function (...args) {
  const result = arrayProto[method].apply(this, args)
  console.log(`我截獲了對數(shù)組的${method}操作`)
  return result
 }
})

const arr = ['kobe', 'jordan']
arr.__proto__ = arrayMethods

arr.push('harden') // '我截獲了對數(shù)組的push操作'
console.log(JSON.stringify(arr)) // '["kobe","jordan","harden"]'

以上,mutationMethods 是所有要攔截的數(shù)組變異方法的集合。

整體思路就是通過設置數(shù)組對象的 __proto__ 屬性的值為一個新對象 arrayMethods,以代理數(shù)組 mutationMethods 中的變異方法,并將 arrayMethods 的原型設置為數(shù)組構(gòu)造函數(shù)本來的原型,這樣方能保證除卻代理的方法以外,不影響數(shù)組本身的其它方法和屬性。

其中:

const arrayMethods = Object.create(Array.prototype)

以上實現(xiàn)了 arrayMethods 的原型是數(shù)組構(gòu)造函數(shù)本來的原型,即 arrayMethods.__proto__ === Array.prototype。

緊接著:

const arrayProto = Array.prototype

這句使用 arrayProto 變量緩存了 Array.prototype。

再然后:

mutationMethods.forEach(method => {
 arrayMethods[method] = function (...args) {
  const result = arrayProto[method].apply(this, args)
  console.log(`我截獲了對數(shù)組的${method}操作`)
  return result
 }
})

將 mutationMethods 進行循環(huán),在 arrayMethods 對象上以 mutationMethods 中各元素為 key,即方法名,定義作為攔截器的同名變異方法。

具體:

const result = arrayProto[method].apply(this, args)

執(zhí)行緩存的 Array.prototype,即 arrayProto 中對應的變異方法,并傳入 this 以及 args,也就是將來調(diào)用該方法的數(shù)組對象,和調(diào)用該方法時傳入的參數(shù)(或參數(shù)列表)轉(zhuǎn)化成的參數(shù)數(shù)組,并將結(jié)果給到變量 result。

這里使用了解構(gòu)賦值的方式將參數(shù)(或參數(shù)列表)轉(zhuǎn)化成了參數(shù)數(shù)組,這么做是因為不能確定參數(shù)的個數(shù),所以只能使用 apply(不能用 call),并傳入?yún)?shù)數(shù)組。

之后:

console.log(`我截獲了對數(shù)組的${method}操作`)

也就是攔截之后要額外執(zhí)行的操作了。

最后:

return result

將數(shù)組原變異方法執(zhí)行的結(jié)果返回,保證原有功能不受影響。

forEach 執(zhí)行完之后:

const arr = ['kobe', 'jordan']
arr.__proto__ = arrayMethods

聲明并初始化 arr,并將 arr 的 __proto__ 指向 arrayMethods,這樣便代理了 mutationMethods 中的變異方法。

最終:

arr.push('harden') // '我截獲了對數(shù)組的push操作'
console.log(JSON.stringify(arr)) // '["kobe","jordan","harden"]'

數(shù)組對象手動擴展的功能以及原功能均正常,實現(xiàn)了數(shù)組變異方法的攔截。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • vue3.0 CLI - 2.6 - 組件的復用入門教程

    vue3.0 CLI - 2.6 - 組件的復用入門教程

    這篇文章主要介紹了 vue3.0 CLI - 2.6 - 組件的復用,非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2018-09-09
  • 關于Element-UI可編輯表格的實現(xiàn)過程

    關于Element-UI可編輯表格的實現(xiàn)過程

    這篇文章主要介紹了關于Element-UI可編輯表格的實現(xiàn)過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Vue3.0結(jié)合bootstrap創(chuàng)建多頁面應用

    Vue3.0結(jié)合bootstrap創(chuàng)建多頁面應用

    這篇文章主要介紹了Vue3.0結(jié)合bootstrap創(chuàng)建多頁面應用,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • Vue項目在IE瀏覽器頁面白屏且報錯SCRIPT1010:缺少標識符問題

    Vue項目在IE瀏覽器頁面白屏且報錯SCRIPT1010:缺少標識符問題

    Vue項目在谷歌瀏覽器中正常運行,但在IE瀏覽器中出現(xiàn)問題,如白屏和控制臺報錯,解決過程包括檢查IE設置、調(diào)整編輯器配置、引入兼容性插件、使用productionSourceMap定位錯誤、檢查插件依賴和版本,以及重新構(gòu)建項目
    2024-09-09
  • 單頁面Vue頁面刷新出現(xiàn)閃爍問題及解決

    單頁面Vue頁面刷新出現(xiàn)閃爍問題及解決

    這篇文章主要介紹了單頁面Vue頁面刷新出現(xiàn)閃爍問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • element-ui如何防止重復提交的方法步驟

    element-ui如何防止重復提交的方法步驟

    這篇文章主要介紹了element-ui如何防止重復提交的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • Vue.js實現(xiàn)的購物車功能詳解

    Vue.js實現(xiàn)的購物車功能詳解

    這篇文章主要介紹了Vue.js實現(xiàn)的購物車功能,結(jié)合實例形式分析了vue.js購物車的原理、數(shù)值計算及頁面元素屬性動態(tài)操作相關實現(xiàn)技巧,需要的朋友可以參考下
    2019-01-01
  • 在vue2.x里面簡單使用socketio問題

    在vue2.x里面簡單使用socketio問題

    這篇文章主要介紹了在vue2.x里面簡單使用socketio問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • vue全局注冊自定義指令防抖解析

    vue全局注冊自定義指令防抖解析

    這篇文章主要介紹了vue全局注冊自定義指令防抖解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • vue實現(xiàn)購物車的小練習

    vue實現(xiàn)購物車的小練習

    這篇文章主要為大家詳細介紹了vue實現(xiàn)購物車的小練習,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12

最新評論

讷河市| 颍上县| 富蕴县| 舟曲县| 电白县| 连山| 左权县| 荆门市| 蕉岭县| 灵武市| 隆化县| 达拉特旗| 滕州市| 富顺县| 平昌县| 浪卡子县| 栾城县| 久治县| 双江| 多伦县| 蒙阴县| 秦皇岛市| 凤城市| 唐山市| 四川省| 临汾市| 奉节县| 襄垣县| 兴山县| 霍城县| 犍为县| 神池县| 凌云县| 西宁市| 林甸县| 罗山县| 若羌县| 安阳县| 南郑县| 连云港市| 邻水|