Javascript 使用类的属性值基于时间影响另一个类对象
目前,我正在尝试学习如何将es6类用于我正在开发的应用程序 目标是根据当前日期增加动物的年龄 动物类Javascript 使用类的属性值基于时间影响另一个类对象,javascript,node.js,oop,Javascript,Node.js,Oop,目前,我正在尝试学习如何将es6类用于我正在开发的应用程序 目标是根据当前日期增加动物的年龄 动物类 Animal.js 类动物{ 建造师(姓名、年龄、物种、性别、活动、生日、饥饿=100、耐力=100、快乐=100){ this.name=名称; 这个。年龄=年龄; 这个物种=物种; 这个。性别=性别; 这个。活动=活动; 饥饿=饥饿; 这个。耐力=耐力; 这个。快乐=快乐; 生日 } 生日(){ 这个年龄++ log(`祝${this.name}生日快乐,${this.name}现在是${t
Animal.js
类动物{
建造师(姓名、年龄、物种、性别、活动、生日、饥饿=100、耐力=100、快乐=100){
this.name=名称;
这个。年龄=年龄;
这个物种=物种;
这个。性别=性别;
这个。活动=活动;
饥饿=饥饿;
这个。耐力=耐力;
这个。快乐=快乐;
生日
}
生日(){
这个年龄++
log(`祝${this.name}生日快乐,${this.name}现在是${this.age}`)
}
}
module.exports=动物
时间班
Time.js
上课时间{
构造函数(){
这1.5秒=0;
这1.5分钟=0;
这1.5天=1;
本季=1;
本年=0;
this.clock=`${this.minutes}:${this.seconds}`;
this.monthDate=`this.season}/${this.days}`
this.yearDate=`${this.season}/${this.days}/${this.year}`
this.timeStamp=`${this.seasure}/${this.days}/${this.year}-${this.minutes}:${this.seconds}`
//启动计时器时
this.countTime=setInterval(this.increaseTime.bind(this),1000)
}
递增时间(){
this.clock=`${this.minutes}:${this.seconds}`
this.monthDate=`this.season}/${this.days}`
this.yearDate=`${this.season}/${this.days}/${this.year}`
this.timeStamp=`${this.seasure}/${this.days}/${this.year}-${this.minutes}:${this.seconds}`
console.log(this.clock)
如果(this.seconds==60){
这1.5秒=0;
这是10分钟++
如果(this.minutes==1){
这1.5分钟=0;
这几天++
console.log(this.timeStamp)
如果(this.days==15){
这1.5天=0;
这个季节++
如果(本季>4){
本季=1;
今年++
}
}
}
}否则{
这一秒++
}
}
}
module.exports=时间;
在这里,我尝试利用它们:
Zoo.js
const-Animal=require(“/动物”);
常数时间=要求(“/时间”);
设time1=新时间();
let gary=新动物(“gary”,10,“大猩猩”,“雄性”,“睡眠”,“1/2”)
如果(time1.monthDate==gary.birth){
加里生日
}
因此,基于time1.monthDate的值(它总是在变化,因为我在Time类中有一个setInterval函数),我将在Animal类中执行一个函数来增加Gary的年龄
我意识到在当前状态下,我需要不断运行此检查,因此我也尝试了以下方法:
while(时间1){
如果(time1.monthDate==gary.birth){
加里。生日();
}
}
尽管我一直在运行此检查,但这也不起作用
任何帮助都将不胜感激,提前感谢
尽管我一直在运行此检查,但这也不起作用
这是因为当循环运行时,没有其他代码可以运行。这包括增加时间的setInterval回调
相反,为什么不提供一种方法来安排对计时器滴答声的回调:
class Time {
constructor() {
this.seconds = 0;
this.minutes = 0;
this.days = 1;
this.season = 1;
this.year = 0;
this.handlers = []; // < collect handlers
// Start timer when
this.countTime = setInterval(this.increaseTime.bind(this), 1000)
}
get clock() { // if this is a getter, it is always up to date
return `${this.minutes}:${this.seconds}`;
}
get monthDate() {
return `${this.season}/${this.days}`;
}
get yearDate() {
return `${this.season}/${this.days}/${this.year}`;
}
get timeStamp () {
return `${this.season}/${this.days}/${this.year}-${this.minutes}:${this.seconds}`;
}
increaseTime() {
this.seconds++
if (this.seconds === 60) {
this.seconds = 0;
this.minutes++;
}
if (this.minutes === 1) {
this.minutes = 0;
this.days++;
}
if (this.days === 15) {
this.days = 0;
this.season++
}
if (this.season > 4) {
this.season = 1;
this.year++
}
this.handlers.forEach(h => h(this)); // < trigger handlers
}
onTick(h) { this.handlers.push(h); }
}
this.birth=birth
同时使用birth()
方法将不起作用。我建议从time
构造函数中删除this.countTime=setInterval(this.increaseTime.bind(this),1000)
。相反,实例化time1
和gary
,然后创建执行setInterval(function(){time1.increaseTime();if(time1.monthDate==gary.birth)gary.birth();},1000)的间隔,yearDate
和timeStamp
增加秒数后。或者更好的是,完全删除它们,改为使用getter,这样只有当你访问它的时候,时间才会被格式化。这对我来说是成功的!现在我面临下一个挑战,我需要确保他不再衰老。谢谢
time1.onTick(() => {
if (time1.monthDate === gary.birthday) {
gary.birthday();
}
});