我可以在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社区的所有人,我现在才加入。


扬帆大鱼
浏览 79回答 2
2回答

繁花不似锦

似乎你想做这样的事情(在伪代码中):let obj = {  today: new Date(),  yesterday: today - 1 day,  tomorrow: today + 1 day};您设置今天的任何值的位置以及昨天和今天都会相应地更新。您可以使用 getter 执行此操作,以便获取昨天和明天的值会根据今天的值计算它们。例如:let obj = {  get yesterday() {    if (this.today != undefined) {      let d = new Date(this.today);      d.setDate(d.getDate() - 1);      return d;    } else {      return void 0;    }  },  get tomorrow() {    if (this.today != undefined) {      let d = new Date(this.today);      d.setDate(d.getDate() + 1);      return d;    } else {      return void 0;    }  }};// Initial valuesconsole.log('Yesterday: ' + obj.yesterday)console.log('Today    : ' + obj.today)console.log('Tomorrow : ' + obj.tomorrow)// Set todayobj.today = new Date();// Get valuesconsole.log('Yesterday: ' + obj.yesterday.toDateString());console.log('Today    : ' + obj.today.toDateString());console.log('Tomrrow  : ' + obj.tomorrow.toDateString());

临摹微笑

我个人不会为这种功能扩展原型而烦恼。您也可以在日期对象周围有一个包装器,该对象根据您最初发送的日期处理任何计算。然后,可以使用此日期来获取相对于原始日期的下一个或上一个周期。我添加了我的意思的一个片段,它为您提供了一种简单的方法来确定您最初要求的日期,以及它的付款日期。付款的结束期将是下一个期间的开始日期减去1天。// from: https://stackoverflow.com/a/7751977/3231537const twoWeeks = 12096e5;// from: https://gist.github.com/dblock/1081513var 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 );
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript