[英]Call a function that returns a number as fn(10) or fn * 10
我正在尝试编写一个 function,它返回可以在以下两个 forms 中调用的天数(以毫秒为单位):
days(7) // Expected output 604800000
days * 7 // Expected output 604800000
下面的代码有效,但修改了 Function 原型:
Function.prototype.valueOf = function() {
return this();
}
Function.prototype.toString = function() {
return this.valueOf().toString();
}
const d = 1000 * 60 * 60 * 24
const days = function (n) { return n && n * d || d}
console.log(days(7)); // 604800000
console.log(days * 7); // 604800000
console.log(days.toString(), `${days}`) // 86400000 86400000
console.log(days) // [λ: days]
尽管有多种方法,但我无法在不修改原型的情况下完成这项工作。 这是一种尝试供参考。 (我也尝试过使用代理)
const d = 1000 * 60 * 60 * 24
function Days() {
return function (n) { return n && n * d || d}
}
Days.prototype.valueOf = function() {
return this();
}
Days.prototype.toString = function() {
return this.valueOf().toString();
}
const days = new Days()
console.log(days(7)); // 604800000
console.log(days * 7); // NaN
console.log(days.toString(), `${days}`) // function (n) { var $_$c = $_$wf(1); ...
console.log(days) // [λ]
感谢期待!
您可以关闭 function ,它返回一个带有参数的值,并实现一个toString
function ,它返回一天的值。
const days = (d => { function f(n) { return n * d; } f.toString = function () { return d; }; return f; })(1000 * 60 * 60 * 24); console.log(days(7)) // 604800000 console.log(days * 7); // 604800000
class Day { constructor(days = 1) { this.days = days; } toString() { return Day * this.days; } static toString() { return 86400000; } } const sevenDays = new Day(7); console.log(sevenDays); // { "days": 7 } console.log(`${sevenDays}`); // 604800000 console.log(Day); // 1 Day (default) = 86400000 console.log(Day * 2); // 2 Days = 172800000 console.log(7 * Day); // 7 Days = 604800000 console.log(Day + 86400000 + 86400000); // 3 Days = 259200000
感谢@Nina Scholz,这就是我实现的:
const makeUnit = u => function (d) {
const f = n => n * d
f.valueOf = () => d
f.toString = () => f.valueOf().toString()
return f;
}(u);
const seconds = makeUnit(1000)
const minutes = makeUnit(seconds * 60)
const hours = makeUnit(minutes * 60)
const days = makeUnit(hours * 24)
const weeks = makeUnit(days * 7)
console.log(seconds(1)) // 1000
console.log(minutes(1)) // 60000
console.log(hours(1)) // 3600000
console.log(days(1)) // 86400000
console.log(weeks(1)) // 604800000
console.log(seconds * 1) // 1000
console.log(minutes * 1) // 60000
console.log(hours * 1) // 3600000
console.log(days * 1) // 86400000
console.log(weeks * 1) // 604800000
console.log(days.toString(), `${days}`) // 86400000 86400000
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.