首页 > 解决方案 > 我可以使用 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 社区中的所有人,我刚刚加入。

标签: javascriptdateobject

解决方案


我个人不会为这种功能扩展原型而烦恼。您可能还需要一个围绕日期对象的包装器,该包装器根据您最初发送的日期处理任何计算。

然后,该日期可用于到达相对于原始日期的下一个或上一个时期。

我添加了我的意思的片段,它为您提供了一种简单的方法来确定您最初要求的日期,它是付款日期。付款的结束期间将是下一个期间的开始日期减去 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 );


推荐阅读