javascript - 我可以使用 Javascript 中的自引用函数定义对象的属性吗?
问题描述
我试图根据当前日期确定四个日期——从当前支付期的开始到今天,然后是上一个支付期的开始和结束日期——我无法找到正确的执行。
对我来说,拥有一个具有四个属性(如 payPd.currentStart、payPd.currentEnd、payPd.priorStart 和 payPd.priorEnd)的对象是有意义的。
目前,我正在从今天的 .currentEnd 向后工作,并减去天数,直到奇数周的星期一——支付期为两周:
var dt = new Date();
Date.prototype.getWeek = function () {
var onejan = new Date(this.getFullYear(), 0, 1);
return Math.ceil((((this - onejan) / 86400000) + onejan.getDay() + 1) / 7);
}
var currentStart = '';
var currentEnd = new Date();
var priorStart = '';
var priorEnd = '';
function ppdStart(currentEnd){
var inDate = currentEnd;
while (inDate.getWeek() % 2 !== 0 || inDate.getDay() !== 1) {
inDate.setDate(inDate.getDate() - 1);
}
return outDate;
}
所以问题是,我可以定义一个属性,然后将下一个属性定义为该属性的函数(今天之前的下一个奇数星期一),以此类推吗?我想要一个回调函数,还是一个get/set?我不确定下一步该去哪里。
感谢 Javascript 社区中的所有人,我刚刚加入。
解决方案
我个人不会为这种功能扩展原型而烦恼。您可能还需要一个围绕日期对象的包装器,该包装器根据您最初发送的日期处理任何计算。
然后,该日期可用于到达相对于原始日期的下一个或上一个时期。
我添加了我的意思的片段,它为您提供了一种简单的方法来确定您最初要求的日期,它是付款日期。付款的结束期间将是下一个期间的开始日期减去 1 天。
// from: https://stackoverflow.com/a/7751977/3231537
const twoWeeks = 12096e5;
// from: https://gist.github.com/dblock/1081513
var weekOfYear = function(date){
var d = new Date(+date);
d.setHours(0,0,0);
d.setDate(d.getDate()+4-(d.getDay()||7));
return Math.ceil((((d-new Date(d.getFullYear(),0,1))/8.64e7)+1)/7);
};
class PayDateHelper {
constructor( date ) {
this._date = date;
}
nextPayPeriod() {
return new PayDateHelper( new Date( this.currentDate.getTime() + twoWeeks ) );
}
previousPayPeriod() {
return new PayDateHelper( new Date( this.currentDate.getTime() - twoWeeks ) );
}
get currentDate() {
return this._date;
}
get payDate() {
let interval = 0;
// when we are in an even week, subtract 7 days
if ( weekOfYear( this.currentDate ) % 2 === 0 ) {
interval += 7;
}
// and substract the days of the week back to 1 (monday)
interval += (this.currentDate.getDay() - 1);
const date = new Date( this.currentDate );
date.setDate( date.getDate() - interval );
return date;
}
}
console.log('-- current period');
let helper = new PayDateHelper( new Date() );
console.log( helper.currentDate );
console.log( helper.payDate );
console.log('-- next period');
let nextPeriod = helper.nextPayPeriod();
console.log( nextPeriod.currentDate );
console.log( nextPeriod.payDate );
console.log('-- previous period');
let previousPeriod = helper.previousPayPeriod();
console.log( previousPeriod.currentDate );
console.log( previousPeriod.payDate );
推荐阅读
- java - 发送消息时用户未收到推送通知。应用程序不会崩溃,所以不能说我哪里出错了。只是其他用户没有得到它们
- sql - 如何计算 SQL 中两个值之间的差异?
- c++ - 在 Xcode developer Returning Undefined symbols for architecture x86_64 中:
- c# - 如何绘制 ab=0?
- vb.net - 检查多个 TexBox 中的某些文本
- kubernetes - acme 登台环境显示无效证书
- python - 在没有 XPath 的情况下使用 Selenium 查找元素
- python - 关于 keras 中的 batch_size 和 epochs 的问题
- c# - 如何使用 NUGET 删除 dbContext 命令?
- xaml - 让搜索栏结果显示在其他内容之上