如果我有一个名为menu的对象:
var menu ={
pizza: getMenu,
burger: getMenu
}
function getMenu(){
//do something
}
如果我将menu.burger()
调用console.log
'汉堡'并执行menu.pizza()
来记录'披萨',我想要。
我不想将任何参数传递给getMenu
,并且调用arguments.callee.name
将始终返回getMenu
。还有另一种方法可以让名称调用getMenu
函数吗?
答案 0 :(得分:0)
有几种方法可以达到你想要的效果。通过在菜单对象上使用不可枚举的跟踪器,或稍微修改功能。我在这里写的是最简单的一个:
var menu ={
pizza: function(){getMenu.call(this,"pizza")},
burger: function(){getMenu.call(this,"burger")}
}
function getMenu(key){
console.log(key);
}
menu.pizza();//pizza
如果你想在不将参数传递给getMenu的情况下实现你想要的东西,你需要使用另一个不可数的getter / setter来跟踪最后一个被调用的方法。其他方式也可以实现,但如果你想要的只是控制台日志,我会使用在内存中单独保存的匿名函数,因此它们是唯一的:
var menu ={
pizza: function(){for(var i in this){if(this[i] === menu.pizza){console.log(i);break;}}},
burger: function(){for(var i in this){if(this[i] === menu.burger){console.log(i);break;}}}
}
menu.pizza()//pizza
wayyy simpler
答案 1 :(得分:0)
这是我的解决方案,很好但不漂亮:D
var menu = {
pizza: getMenu,
burger: getMenu
}
function getMenu() { console.log('do something') }
Object.keys(menu).forEach(item => {
Object.defineProperty(menu, item, {
configurable: true,
enumerable: true,
set(val){
this.value=val
},
get() {
console.log(item)
return this.value
}
})
menu[item] = getMenu
})
console.log(menu.pizza())