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ā)的時候經常會忘了兼容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 // 修改第一個入參,橫崗改斜杠 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的其他功能也能正常使用
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
JS提示:Uncaught SyntaxError:Unexpected token ) 錯誤的解決方法
這篇文章主要介紹了JS提示:Uncaught SyntaxError:Unexpected token ) 錯誤的解決方法,結合實例形式分析了javascript提示此類異常的常見原因與相關解決方法,需要的朋友可以參考下2016-08-08jquery $(document).ready()和window.onload的區(qū)別淺析
這篇文章主要介紹了jquery $(document).ready()和 window.onload的區(qū)別淺析,本文總結了執(zhí)行時間、編寫個數(shù)不同、簡化寫法等不同的地方,需要的朋友可以參考下2015-02-02