调用一个函数,该函数将数字返回为 fn(10) 或 fn * 10



我正在尝试编写一个函数,该函数以毫秒为单位返回可以以以下两种形式调用的天数:

days(7) // Expected output 604800000
days * 7 // Expected output 604800000 

下面的代码有效,但修改了函数原型:


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) // [λ] 

期待中的感谢!

您可以在返回带有参数的值的函数上采用闭包,并实现一个返回一天值的toString函数。

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

最新更新