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)ⅲ瑱M崗改斜杠
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)文章
基于JavaScript實(shí)現(xiàn)簡(jiǎn)單的隨機(jī)抽獎(jiǎng)小程序
為了使抽獎(jiǎng)程序能夠無(wú)需配置平臺(tái)直接可以在任何一臺(tái)機(jī)器上運(yùn)行,開(kāi)發(fā)工具和編譯運(yùn)行工具也能夠盡可能簡(jiǎn)單(諸如text文本即可編輯,window系統(tǒng)自帶的瀏覽器即可編譯運(yùn)行的情況),決定嘗試使用javascript來(lái)做2016-01-01
EasyUi中的Combogrid 實(shí)現(xiàn)分頁(yè)和動(dòng)態(tài)搜索遠(yuǎn)程數(shù)據(jù)
jquery easyui中的combogrid比較特殊,算是combo和grid的組合,combogrid結(jié)合一個(gè)可編輯的文本框和下拉數(shù)據(jù)網(wǎng)格面板,可以讓用戶(hù)迅速找到并選擇,又可以進(jìn)行搜索,展示與當(dāng)前輸入的字符相匹配的數(shù)據(jù)。下面給大家介紹EasyUi中的Combogrid 實(shí)現(xiàn)分頁(yè)和動(dòng)態(tài)搜索遠(yuǎn)程數(shù)據(jù)2016-04-04
微信公眾平臺(tái)開(kāi)發(fā)教程(四) 實(shí)例入門(mén):機(jī)器人回復(fù)(附源碼)
本篇文章主要介紹了微信公眾平臺(tái)開(kāi)發(fā)機(jī)器人,可以實(shí)現(xiàn)簡(jiǎn)單對(duì)話和查詢(xún)天氣等,有需要的可以了解一下。2016-12-12
javascript實(shí)現(xiàn)移動(dòng)端紅包雨頁(yè)面
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)移動(dòng)端紅包雨頁(yè)面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06
BootStrap 圖片樣式、輔助類(lèi)樣式和CSS組件的實(shí)例詳解
這篇文章主要介紹了BootStrap 圖片樣式、輔助類(lèi)樣式和CSS組件的實(shí)現(xiàn)代碼,圖文并茂介紹的非常詳細(xì),需要的朋友參考下吧2017-01-01
js實(shí)現(xiàn)簡(jiǎn)單鎖屏功能實(shí)例
這篇文章主要介紹了js實(shí)現(xiàn)簡(jiǎn)單鎖屏功能的方法,實(shí)例分析了javascript操作頁(yè)面元素顯示與隱藏的相關(guān)技巧,涉及javascript操作元素屬性與鼠標(biāo)、鍵盤(pán)事件的相關(guān)技巧,需要的朋友可以參考下2015-05-05

