JS重寫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è)坑,需要做一些額外的特殊處理,筆者在開發(fā)的時(shí)候經(jīng)常會(huì)忘了兼容IOS系統(tǒng)。
所以就想試著重寫Date函數(shù),一勞永逸,避免每次new Date都要考慮兼容性的問(wèn)題。
分析
JS中要重寫類,分為3步
- 重寫構(gòu)造函數(shù)
- 繼承原類的原型鏈函數(shù)
- 繼承原類的靜態(tài)函數(shù)
1、 重寫Date構(gòu)造函數(shù)
重寫構(gòu)造函數(shù),考慮到構(gòu)造函數(shù)傳參可能會(huì)傳Number格式的時(shí)間戳,所以重寫Date的構(gòu)造函數(shù),判斷3個(gè):
- 是否包含第一個(gè)參數(shù)
- 第一個(gè)參數(shù)類型是否為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)單,指向原類的原型鏈即可,代碼如下
Date.prototype = OldDate.prototype
3、 繼承靜態(tài)函數(shù)
每個(gè)類在創(chuàng)建出來(lái)的時(shí)候都會(huì)有默認(rèn)的靜態(tài)函數(shù),只需要繼承原類有的而重寫后Date沒有的靜態(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
// 重寫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提示此類異常的常見原因與相關(guān)解決方法,需要的朋友可以參考下2016-08-08
uniapp獲取頁(yè)面高度與元素高度簡(jiǎn)單示例
在實(shí)際開發(fā)中我們會(huì)遇到不確定高度的情況,那么在uniapp中我們?nèi)绾潍@取區(qū)域的高度吶?這篇文章主要給大家介紹了關(guān)于uniapp獲取頁(yè)面高度與元素高度的相關(guān)資料,需要的朋友可以參考下2023-09-09
JavaScript函數(shù)定義的常見注意事項(xiàng)小結(jié)
這篇文章主要介紹了JavaScript函數(shù)定義的常見注意事項(xiàng),包含了常見的錯(cuò)誤及注意事項(xiàng),需要的朋友可以參考下2014-09-09
jquery $(document).ready()和window.onload的區(qū)別淺析
這篇文章主要介紹了jquery $(document).ready()和 window.onload的區(qū)別淺析,本文總結(jié)了執(zhí)行時(shí)間、編寫個(gè)數(shù)不同、簡(jiǎn)化寫法等不同的地方,需要的朋友可以參考下2015-02-02

