JS重寫(xiě)Date函數(shù)以及兼容IOS系統(tǒng)
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提示:Uncaught SyntaxError:Unexpected token ) 錯(cuò)誤的解決方法
這篇文章主要介紹了JS提示:Uncaught SyntaxError:Unexpected token ) 錯(cuò)誤的解決方法,結(jié)合實(shí)例形式分析了javascript提示此類(lèi)異常的常見(jiàn)原因與相關(guān)解決方法,需要的朋友可以參考下2016-08-08uniapp獲取頁(yè)面高度與元素高度簡(jiǎn)單示例
在實(shí)際開(kāi)發(fā)中我們會(huì)遇到不確定高度的情況,那么在uniapp中我們?nèi)绾潍@取區(qū)域的高度吶?這篇文章主要給大家介紹了關(guān)于uniapp獲取頁(yè)面高度與元素高度的相關(guān)資料,需要的朋友可以參考下2023-09-09JavaScript函數(shù)定義的常見(jiàn)注意事項(xiàng)小結(jié)
這篇文章主要介紹了JavaScript函數(shù)定義的常見(jiàn)注意事項(xiàng),包含了常見(jiàn)的錯(cuò)誤及注意事項(xiàng),需要的朋友可以參考下2014-09-09jquery $(document).ready()和window.onload的區(qū)別淺析
這篇文章主要介紹了jquery $(document).ready()和 window.onload的區(qū)別淺析,本文總結(jié)了執(zhí)行時(shí)間、編寫(xiě)個(gè)數(shù)不同、簡(jiǎn)化寫(xiě)法等不同的地方,需要的朋友可以參考下2015-02-02