手抄Vue(三)—— 數(shù)組響應(yīng)的補(bǔ)充

上篇 Vue數(shù)據(jù)響應(yīng)原理(二)—— 數(shù)組的響應(yīng) 中是鬼,沒有考慮兼容性問題肤舞,__proto__ 屬性在 IE10 以及更低版本 IE 中是不支持的,需實(shí)現(xiàn)兼容方案均蜜。

思路就是直接在數(shù)組實(shí)例上面定義新的同名變異方法作為“攔截器”:

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(`我截獲了對(duì)數(shù)組的${method}操作`)
    return result
  }
})

const arr = ['kobe', 'jordan']

mutationMethods.forEach(method => {
  arr[method] = arrayMethods[method]
})

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

數(shù)組變異方法擴(kuò)展功能以及原功能均正常李剖。

但仍然有一個(gè)問題:

console.log(JSON.stringify(Object.keys(arr))) // ["0","1","2","push","pop","shift","unshift","splice","sort","reverse"]

直接添加到數(shù)組實(shí)例上的這些方法都是可枚舉的,按理說囤耳,數(shù)組本身的變異方法不應(yīng)該被枚舉出來篙顺。

那么,使用 Object.defineProperty 將其定義為不可枚舉:

mutationMethods.forEach(method => {
  Object.defineProperty(arr, method, {
    enumerable: false,
    writable: true,
    configurable: true,
    value: arrayMethods[method]
  })
})

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

console.log(JSON.stringify(Object.keys(arr))) // '["0","1","2"]'

那么低版本 IE 的兼容代碼就成了這樣:

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(`我截獲了對(duì)數(shù)組的${method}操作`)
    return result
  }
})

const arr = ['kobe', 'jordan']

mutationMethods.forEach(method => {
  Object.defineProperty(arr, method, {
    enumerable: false,
    writable: true,
    configurable: true,
    value: arrayMethods[method]
  })
})

結(jié)合上一篇充择,便可實(shí)現(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(`我截獲了對(duì)數(shù)組的${method}操作`)
    return result
  }
})

const arr = ['kobe', 'jordan']

if ('__proto__' in {}) {
  arr.__proto__ = arrayMethods
} else {
  mutationMethods.forEach(method => {
    Object.defineProperty(arr, method, {
      enumerable: false,
      writable: true,
      configurable: true,
      value: arrayMethods[method]
    })
  })
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末德玫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子椎麦,更是在濱河造成了極大的恐慌宰僧,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,423評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件观挎,死亡現(xiàn)場離奇詭異琴儿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)嘁捷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門造成,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人普气,你說我怎么就攤上這事谜疤。” “怎么了现诀?”我有些...
    開封第一講書人閱讀 157,019評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵夷磕,是天一觀的道長。 經(jīng)常有香客問我仔沿,道長坐桩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,443評(píng)論 1 283
  • 正文 為了忘掉前任封锉,我火速辦了婚禮绵跷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘成福。我一直安慰自己碾局,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,535評(píng)論 6 385
  • 文/花漫 我一把揭開白布奴艾。 她就那樣靜靜地躺著净当,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蕴潦。 梳的紋絲不亂的頭發(fā)上像啼,一...
    開封第一講書人閱讀 49,798評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音潭苞,去河邊找鬼忽冻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛此疹,可吹牛的內(nèi)容都是我干的僧诚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,941評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼蝗碎,長吁一口氣:“原來是場噩夢啊……” “哼振诬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起衍菱,我...
    開封第一講書人閱讀 37,704評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤赶么,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后脊串,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辫呻,經(jīng)...
    沈念sama閱讀 44,152評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,494評(píng)論 2 327
  • 正文 我和宋清朗相戀三年琼锋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了放闺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,629評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缕坎,死狀恐怖怖侦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤匾寝,帶...
    沈念sama閱讀 34,295評(píng)論 4 329
  • 正文 年R本政府宣布搬葬,位于F島的核電站,受9級(jí)特大地震影響艳悔,放射性物質(zhì)發(fā)生泄漏急凰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,901評(píng)論 3 313
  • 文/蒙蒙 一猜年、第九天 我趴在偏房一處隱蔽的房頂上張望抡锈。 院中可真熱鬧,春花似錦乔外、人聲如沸床三。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撇簿。三九已至,卻和暖如春推汽,著一層夾襖步出監(jiān)牢的瞬間补疑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評(píng)論 1 266
  • 我被黑心中介騙來泰國打工歹撒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留莲组,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,333評(píng)論 2 360
  • 正文 我出身青樓暖夭,卻偏偏與公主長得像锹杈,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子迈着,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,499評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容