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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
基于JavaScript實現(xiàn)簡單的隨機抽獎小程序
為了使抽獎程序能夠無需配置平臺直接可以在任何一臺機器上運行,開發(fā)工具和編譯運行工具也能夠盡可能簡單(諸如text文本即可編輯,window系統(tǒng)自帶的瀏覽器即可編譯運行的情況),決定嘗試使用javascript來做2016-01-01
EasyUi中的Combogrid 實現(xiàn)分頁和動態(tài)搜索遠程數(shù)據(jù)
jquery easyui中的combogrid比較特殊,算是combo和grid的組合,combogrid結合一個可編輯的文本框和下拉數(shù)據(jù)網(wǎng)格面板,可以讓用戶迅速找到并選擇,又可以進行搜索,展示與當前輸入的字符相匹配的數(shù)據(jù)。下面給大家介紹EasyUi中的Combogrid 實現(xiàn)分頁和動態(tài)搜索遠程數(shù)據(jù)2016-04-04
微信公眾平臺開發(fā)教程(四) 實例入門:機器人回復(附源碼)
本篇文章主要介紹了微信公眾平臺開發(fā)機器人,可以實現(xiàn)簡單對話和查詢天氣等,有需要的可以了解一下。2016-12-12
BootStrap 圖片樣式、輔助類樣式和CSS組件的實例詳解
這篇文章主要介紹了BootStrap 圖片樣式、輔助類樣式和CSS組件的實現(xiàn)代碼,圖文并茂介紹的非常詳細,需要的朋友參考下吧2017-01-01

