这就是我所说的。
Algebra.twoplustwo() //4
Algebra.fourtimesnine() //36
当调用Algebra
中的函数时,该对象具有一个处理程序,该处理程序解析调用的函数的名称以确定要执行的操作。
这可能吗?如果没有找到函数,对象是否具有默认函数?
答案 0 :(得分:1)
是的,可以在空对象上使用ES6 Proxy:
var Algebra = new Proxy({}, {
// Intercept member access:
get: function(target, name) {
// Helper function to translate word to number
// -- extend it to cover for more words:
function toNumber(name) {
var pos = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"].indexOf(name);
return pos === -1 ? NaN : pos;
}
// See if we can understand the name:
var parts = name.split('plus');
if (parts.length > 1) {
parts = parts.map(toNumber);
// Return result as a function:
return _ => parts[0] + parts[1];
}
var parts = name.split('times');
if (parts.length > 1) {
parts = parts.map(toNumber);
// Return result as a function:
return _ => parts[0] * parts[1];
}
}
});
// Sample calls:
console.log(Algebra.twoplustwo());
console.log(Algebra.fourtimesnine());
正如您所看到的,实际上并不需要将这些名称称为方法,您可以将它们解释为属性:
而不是返回一个函数:
return _ => parts[0] * parts[1];
...你可以返回结果:
return parts[0] * parts[1];
然后您将其作为属性访问:
Algebra.threetimesfour