如何使用父名称获取函数名称?

时间:2018-05-14 10:07:16

标签: javascript

如果我有一个名为menu的对象:

var menu  ={
    pizza: getMenu,    
    burger: getMenu
}

function getMenu(){
    //do something
}

如果我将menu.burger()调用console.log'汉堡'并执行menu.pizza()来记录'披萨',我想要。

我不想将任何参数传递给getMenu,并且调用arguments.callee.name将始终返回getMenu。还有另一种方法可以让名称调用getMenu函数吗?

2 个答案:

答案 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())