为了账号安全,请及时绑定邮箱和手机立即绑定

我可以在Javascript中使用自引用函数定义对象的属性吗?

我可以在Javascript中使用自引用函数定义对象的属性吗?

扬帆大鱼 2022-08-18 10:53:46
我试图根据当前日期确定四个日期 - 当前支付期的开始到今天,然后是上一个支付期的开始日期和结束日期 - 我很难找到正确的执行。对我来说,有一个具有四个属性的对象是有意义的,比如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社区的所有人,我现在才加入。
查看完整描述

2 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

似乎你想做这样的事情(在伪代码中):


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 values

console.log('Yesterday: ' + obj.yesterday)

console.log('Today    : ' + obj.today)

console.log('Tomorrow : ' + obj.tomorrow)

// Set today

obj.today = new Date();

// Get values

console.log('Yesterday: ' + obj.yesterday.toDateString());

console.log('Today    : ' + obj.today.toDateString());

console.log('Tomrrow  : ' + obj.tomorrow.toDateString());


查看完整回答
反对 回复 2022-08-18
?
临摹微笑

TA贡献1982条经验 获得超2个赞

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


然后,可以使用此日期来获取相对于原始日期的下一个或上一个周期。


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


查看完整回答
反对 回复 2022-08-18
  • 2 回答
  • 0 关注
  • 78 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信