亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JS重寫(xiě)Date函數(shù)以及兼容IOS系統(tǒng)

 更新時(shí)間:2023年10月23日 10:46:32   作者:milugloomy  
這篇文章主要介紹了JS重寫(xiě)Date函數(shù)以及兼容IOS系統(tǒng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

IOS系統(tǒng)Date的坑

要?jiǎng)?chuàng)建一個(gè)指定時(shí)間的new Date對(duì)象時(shí),通常的做法是:

new Date("2020-09-21 11:11:00")

這行代碼在 PC 端和安卓端都是正常的,而在 iOS 端則會(huì)提示 Invalid Date 無(wú)效日期。在IOS年月日中間的橫崗許換成斜杠,也就是

new Date("2020/09/21 11:11:00")

通常為了兼容IOS的這個(gè)坑,需要做一些額外的特殊處理,筆者在開(kāi)發(fā)的時(shí)候經(jīng)常會(huì)忘了兼容IOS系統(tǒng)。

所以就想試著重寫(xiě)Date函數(shù),一勞永逸,避免每次new Date都要考慮兼容性的問(wèn)題。

分析

JS中要重寫(xiě)類(lèi),分為3步

  • 重寫(xiě)構(gòu)造函數(shù)
  • 繼承原類(lèi)的原型鏈函數(shù)
  • 繼承原類(lèi)的靜態(tài)函數(shù)

1、 重寫(xiě)Date構(gòu)造函數(shù)

重寫(xiě)構(gòu)造函數(shù),考慮到構(gòu)造函數(shù)傳參可能會(huì)傳Number格式的時(shí)間戳,所以重寫(xiě)Date的構(gòu)造函數(shù),判斷3個(gè):

  • 是否包含第一個(gè)參數(shù)
  • 第一個(gè)參數(shù)類(lèi)型是否為String
  • 第一個(gè)參數(shù)是否包含短橫崗-

代碼如下

const OldDate = Date
// 修改第一個(gè)入?yún)?,橫崗改斜杠
Date = function () {
  if (arguments.length > 0 && typeof (arguments[0]) === 'string' && arguments[0].includes('-')) {
    const p = arguments[0].replace(/-/g, '/')
    arguments[0] = p
  }
  return new OldDate(...arguments)
}

2、 繼承原型函數(shù)

這個(gè)簡(jiǎn)單,指向原類(lèi)的原型鏈即可,代碼如下

Date.prototype = OldDate.prototype

3、 繼承靜態(tài)函數(shù)

每個(gè)類(lèi)在創(chuàng)建出來(lái)的時(shí)候都會(huì)有默認(rèn)的靜態(tài)函數(shù),只需要繼承原類(lèi)有的而重寫(xiě)后Date沒(méi)有的靜態(tài)函數(shù),代碼如下:

const oldDateStaticParam = Object.getOwnPropertyNames(OldDate)
const dateStaticParam = Object.getOwnPropertyNames(Date)
const diffParam = []
for (let i = 0; i < oldDateStaticParam.length; i++) {
  let find = false
  for (let j = 0; j < dateStaticParam.length; j++) {
    if (oldDateStaticParam[i] === dateStaticParam[j]) {
      find = true
      break
    }
  }
  if (!find) {
    diffParam.push(oldDateStaticParam[i])
  }
}
for (let i = 0; i < diffParam.length; i++) {
  Date[diffParam[i]] = OldDate[diffParam[i]]
}

完整代碼

function wrapDate () {
  const OldDate = Date
  // 重寫(xiě)arguments[0]
  Date = function () {
    if (arguments.length > 0 && typeof (arguments[0]) === 'string' && arguments[0].includes('-')) {
      const p = arguments[0].replace(/-/g, '/')
      arguments[0] = p
    }
    return new OldDate(...arguments)
  }
  // 繼承原型函數(shù)
  Date.prototype = OldDate.prototype
  // 繼承靜態(tài)函數(shù),過(guò)濾已有的靜態(tài)函數(shù)和參數(shù),取數(shù)組差集
  const oldDateStaticParam = Object.getOwnPropertyNames(OldDate)
  const dateStaticParam = Object.getOwnPropertyNames(Date)
  const diffParam = []
  for (let i = 0; i < oldDateStaticParam.length; i++) {
    let find = false
    for (let j = 0; j < dateStaticParam.length; j++) {
      if (oldDateStaticParam[i] === dateStaticParam[j]) {
        find = true
        break
      }
    }
    if (!find) {
      diffParam.push(oldDateStaticParam[i])
    }
  }
  for (let i = 0; i < diffParam.length; i++) {
    Date[diffParam[i]] = OldDate[diffParam[i]]
  }
}
// IOS環(huán)境
if (navigator.userAgent.includes('iPhone') || navigator.userAgent.includes('iPad')) {
  compatIos()
}
const date1 = new Date('1997-11-11 11:11:11')
console.log(date1)
const date2 = new Date('1997/11/11 11:11:11')
console.log(date2)

測(cè)試運(yùn)行通過(guò),在IOS端是正常的,Date的其他功能也能正常使用

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • js活用事件觸發(fā)對(duì)象動(dòng)作

    js活用事件觸發(fā)對(duì)象動(dòng)作

    現(xiàn)在基本上我很少在對(duì)象里面寫(xiě)事情觸發(fā)行為了,因?yàn)楦杏X(jué)那樣做相同的對(duì)象代碼利用率太低,容易導(dǎo)致代碼冗余.
    2008-08-08
  • 原生js實(shí)現(xiàn)電子時(shí)鐘

    原生js實(shí)現(xiàn)電子時(shí)鐘

    這篇文章主要為大家詳細(xì)介紹了原生js實(shí)現(xiàn)電子時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • javascript 有用的腳本函數(shù)

    javascript 有用的腳本函數(shù)

    大家注意看下,感覺(jué)應(yīng)該是批量給網(wǎng)頁(yè)的一些標(biāo)簽加樣式的函數(shù)。
    2009-05-05
  • JS提示:Uncaught SyntaxError:Unexpected token ) 錯(cuò)誤的解決方法

    JS提示:Uncaught SyntaxError:Unexpected token ) 錯(cuò)誤的解決方法

    這篇文章主要介紹了JS提示:Uncaught SyntaxError:Unexpected token ) 錯(cuò)誤的解決方法,結(jié)合實(shí)例形式分析了javascript提示此類(lèi)異常的常見(jiàn)原因與相關(guān)解決方法,需要的朋友可以參考下
    2016-08-08
  • 淺談ES6 模板字符串的具體使用方法

    淺談ES6 模板字符串的具體使用方法

    本篇文章主要介紹了淺談ES6 模板字符串的具體使用方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • uniapp獲取頁(yè)面高度與元素高度簡(jiǎn)單示例

    uniapp獲取頁(yè)面高度與元素高度簡(jiǎn)單示例

    在實(shí)際開(kāi)發(fā)中我們會(huì)遇到不確定高度的情況,那么在uniapp中我們?nèi)绾潍@取區(qū)域的高度吶?這篇文章主要給大家介紹了關(guān)于uniapp獲取頁(yè)面高度與元素高度的相關(guān)資料,需要的朋友可以參考下
    2023-09-09
  • canvas繪制刮刮卡效果

    canvas繪制刮刮卡效果

    這篇文章主要為大家詳細(xì)介紹了canvas繪制刮刮卡效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • JavaScript函數(shù)定義的常見(jiàn)注意事項(xiàng)小結(jié)

    JavaScript函數(shù)定義的常見(jiàn)注意事項(xiàng)小結(jié)

    這篇文章主要介紹了JavaScript函數(shù)定義的常見(jiàn)注意事項(xiàng),包含了常見(jiàn)的錯(cuò)誤及注意事項(xiàng),需要的朋友可以參考下
    2014-09-09
  • JavaScript兼容瀏覽器FF/IE技巧

    JavaScript兼容瀏覽器FF/IE技巧

    本文給大家分享的是一個(gè)JavaScript兼容火狐瀏覽器與IE瀏覽器的一個(gè)小技巧,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下
    2016-08-08
  • jquery $(document).ready()和window.onload的區(qū)別淺析

    jquery $(document).ready()和window.onload的區(qū)別淺析

    這篇文章主要介紹了jquery $(document).ready()和 window.onload的區(qū)別淺析,本文總結(jié)了執(zhí)行時(shí)間、編寫(xiě)個(gè)數(shù)不同、簡(jiǎn)化寫(xiě)法等不同的地方,需要的朋友可以參考下
    2015-02-02

最新評(píng)論