给出以下
javascript对象:
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]; } } }
原文地址:https://www.jb51.cc/js/157431.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。