اینجا این روش رو استفاده میکنیم : ساختن یه TimeInterval با استفاده از همون Date ولی با اضافه کردن متدهای جدید💡
ایده اصلی اینه که به جای ارث بری کلاسمحور، یه تابع بنویسیم که:
- یه Date جدید میسازیم
- متدهای مورد نیازمون رو بهش اضافه میکنیم
- همون رو برمیگردونیم
var TimeInterval = function(){
var obj = new Date(0);
if(arguments.length === 1){
obj.setTime(arguments[0]);
} else if(arguments.length > 1){
var ms = (arguments[0] || 0) * 86400000 +
(arguments[1] || 0) * 3600000 +
(arguments[2] || 0) * 60000 +
(arguments[3] || 0) * 1000 +
(arguments[4] || 0);
obj.setTime(ms);
}
obj.add = function(t){
if(t.getTime){
this.setTime(this.getTime() + t.getTime());
}
};
obj.subtract = function(t){
if(t.getTime){
this.setTime(this.getTime() - t.getTime());
}
};
obj.equals = function(t){
return this.getTime() === t.getTime();
};
return obj;
}
function diff(t1, t2){
return TimeInterval(t1.getTime() - t2.getTime());
}ساخت با پارامترهای مختلف (بدون overloading):
تابع TimeInterval میتونه ورودیهای مختلف قبول کنه:
TimeInterval(3600000) // 1 ساعت به میلیثانیه
TimeInterval(1,0,0) // 1 ساعت (ساعت، دقیقه، ثانیه)
TimeInterval(1,2,0,0) // 1 روز و 2 ساعت
TimeInterval(1,2,0,0,500) // 1 روز و 2 ساعت و 500 میلیثانیه
با چک کردن arguments.length میفهمیم کاربر چه چیزی داده.
اینو هم برای نمایش خروجی (override کردن toString) به تابع TimeIntervalاضافه میکنیم:
obj.toString = function(){
var days = Math.floor(this.getTime() / 86400000);
return days + " Day(s) " +
this.getUTCHours() + ":" +
this.getUTCMinutes() + ":" +
this.getUTCSeconds();
}مثال از استفاده:
var interval1 = TimeInterval(1, 2, 30, 0, 500); // 1 روز, 2 ساعت, 30 دقیقه, 500 میلیثانیه
var interval2 = TimeInterval(3600000 * 25); // 25 ساعت (معادل 1 روز و 1 ساعت)
interval1.add(interval2);
var difference = diff(interval1, interval2); // 1 Day(s) 2:30:0
توی این روش TimeInterval از Date ارث بری نکرده. اومدیم یه Date ساختیم، بعد متدهای جدید روش ریختیم. این روش رو توی جاوااسکریپت بهش میگن Object Augmentation و خیلی تمیز کار میکنه.
اگه توی پروژه هاتون نیاز به جمع و تفریق زمان یا محاسبه اختلاف بازه های زمانی دارین، این روش هم سادست هم انعطافپذیره، نیازی به هیچی نداره و خود جاوااسکریپت با یه کم خلاقیت جواب میده.
#js #timeinterval
☕️ Telegram | Website | Discord