JS重寫Date函數(shù)以及兼容IOS系統(tǒng)
IOS系統(tǒng)Date的坑
要創(chuàng)建一個指定時間的new Date對象時,通常的做法是:
new Date("2020-09-21 11:11:00")這行代碼在 PC 端和安卓端都是正常的,而在 iOS 端則會提示 Invalid Date 無效日期。在IOS年月日中間的橫崗許換成斜杠,也就是
new Date("2020/09/21 11:11:00")通常為了兼容IOS的這個坑,需要做一些額外的特殊處理,筆者在開發(fā)的時候經(jīng)常會忘了兼容IOS系統(tǒng)。
所以就想試著重寫Date函數(shù),一勞永逸,避免每次new Date都要考慮兼容性的問題。
分析
JS中要重寫類,分為3步
- 重寫構造函數(shù)
- 繼承原類的原型鏈函數(shù)
- 繼承原類的靜態(tài)函數(shù)
1、 重寫Date構造函數(shù)
重寫構造函數(shù),考慮到構造函數(shù)傳參可能會傳Number格式的時間戳,所以重寫Date的構造函數(shù),判斷3個:
- 是否包含第一個參數(shù)
- 第一個參數(shù)類型是否為String
- 第一個參數(shù)是否包含短橫崗-
代碼如下
const OldDate = Date
// 修改第一個入?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ù)
這個簡單,指向原類的原型鏈即可,代碼如下
Date.prototype = OldDate.prototype
3、 繼承靜態(tài)函數(shù)
每個類在創(chuàng)建出來的時候都會有默認的靜態(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ù),過濾已有的靜態(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)
測試運行通過,在IOS端是正常的,Date的其他功能也能正常使用
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
JS提示:Uncaught SyntaxError:Unexpected token ) 錯誤的解決方法
這篇文章主要介紹了JS提示:Uncaught SyntaxError:Unexpected token ) 錯誤的解決方法,結合實例形式分析了javascript提示此類異常的常見原因與相關解決方法,需要的朋友可以參考下2016-08-08
jquery $(document).ready()和window.onload的區(qū)別淺析
這篇文章主要介紹了jquery $(document).ready()和 window.onload的區(qū)別淺析,本文總結了執(zhí)行時間、編寫個數(shù)不同、簡化寫法等不同的地方,需要的朋友可以參考下2015-02-02

