繁体   English   中英

调用 function 以返回 fn(10) 或 fn * 10 的数字

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM