给出以下
@L_301_0@对象:
var commands = { back:{ command: "b",aliases: ["back","go back","backwards"],action: function(){ return this.key; //I want this to return "back" (the prop name) },desc: "goes back" } }
如何从action()中访问“返回”的Property Name?
我认为它应该很简单,但如果它不是简单的东西,我会添加更多的细节.
>注意:别名[0]偶然保留了名称,并且不承诺将来或其他命令保留它.
编辑:
有时我们会变得复杂,而我们可以很快解决问题.
在这种情况下,我可以继续并返回字符串“返回”
解决方法
如上所述返回字符串绝对是最简单的方法.但我可以看到有人可能希望能够通过动态创建的对象获得类似功能的情况,其中直到运行时才知道密钥.
在这种情况下可以使用的解决方案是将命令对象暴露给子对象,以便它们可以自我查找:
var commands = { back:{ command: "b",action: function(){ var commandKeys = Object.keys(commands); for(var i=0; i < commandKeys.length; i++){ if(commands[commandKeys[i]] === this){ return commandKeys[i]; } } },desc: "goes back" } };
在这种情况下,在所有这些操作对象之间共享函数也可能更有意义:
var commands = { back:{ command: "b",action: getAction,desc: "goes back" },forward: { //... action: getAction,//... } }; function getAction() { var commandKeys = Object.keys(commands); for(var i=0; i < commandKeys.length; i++){ if(commands[commandKeys[i]] === this){ return commandKeys[i]; } } }
除非您需要为每个子对象执行某些特定逻辑.
编辑:为了提高效率,我们可以在每次调用时都不执行getAction函数,并添加一个存储名称的属性.这样,查找仅在第一次发生.
var commands = { back:{ command: "b",//... } }; // Only needs to getKey the first time called. function getAction() { if(!this.key) this.key = getKey(this); return this.key; } function getKey(obj) { var commandKeys = Object.keys(commands); for(var i=0; i < commandKeys.length; i++){ if(commands[commandKeys[i]] === obj){ return commandKeys[i]; } } }