微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 从属性值中获取属性键

给出以下 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 举报,一经查实,本站将立刻删除。

相关推荐