【发布时间】:2021-05-12 15:30:56
【问题描述】:
我正在构建一个 JavaScript 类,我想在方法链的末尾返回一个结果,而不调用特定的方法。
示例 1:myDate('01/01/2000').add(1, 'day') 应返回 01/02/2000。
示例 2:myDate('01/01/2000').add(1, 'day').format('MMMM D YYYY') 应返回 January 2 2000。
我知道使用 JS class 可以做到这一点,因为看到它在 DayJs 中工作,我只是不明白如何:https://github.com/iamkun/dayjs/blob/dev/src/index.js#L77
目前,我所拥有的看起来像这样:
class MyDate {
constructor(date) {
this.date = date;
}
add(count, unit) {
this.date = // function
return this; // to enable method chaining
}
format() {
this.date = // function
return this.date; // to return the desired result
}
get() {
return this.date;
}
}
// wrapper function to instantiate class on function call
const myDate = date => new MyDate(date);
通过此设置,我得到以下行为:
示例 3:myDate('01/01/2000').add(1, 'day') 返回 { date: 01/02/2000} 而不是 01/02/2000。
示例 4:myDate('01/01/2000').add(1, 'day').format('MMMM D YYYY') 按预期返回 January 2 2000。
示例 5:myDate('01/01/2000').add(1, 'day').get() 返回 01/02/2000,但我想消除唠叨的 get()...
我用谷歌搜索了这个问题,“js 检测方法链结束”等,但我找不到任何结果可以解释它是如何工作的。
感谢您的帮助!
【问题讨论】:
-
在 DayJs 或 MomentJs 中,您还必须使用
.format ()来获取带有字符串的日期,否则它会返回一个对象,就像您的班级所做的那样。 -
我不确定你为什么认为 DayJS 做的事情明显不同。只有你可以决定一个函数将返回什么——而且没有办法知道有人使用你的 API 将如何使用它,例如,如果他们想要或需要一个他们仍然想要的中间值怎么办能上链吗?
-
@AlTheLazyMonkey @Dave Newton,你们都是对的,感谢您向我指出,我认为您可以从可链接的方法返回
this以外的其他内容,但我错了。这里有一个小示范给那些仍有疑问的人:replit.com/@RilDev/DayJSClassExamples#index.js
标签: javascript class method-chaining