Javascript 对象:对属性名称的反向引用

Edu*_*oço 5 javascript properties object

我试图简化 javascript 对象内容的创建,以便值取决于成员名称,如下所示:

var obj = {
    1: "you selected 1",
    2: "wow, you selected 2",
    3: "this time, you selected " + myName(), //myName() gets resolved to 3
    137: "I think you've chosen " + myName() + " this time.", //myName() gets resolved to 137
    513: myName() + " is the answer!" //myName() gets resolved to 513
};
Run Code Online (Sandbox Code Playgroud)

是否可以使用类似于假定的函数myName()的方式反向引用值定义中的成员名称?

如果不存在本机方法,建议的方法是什么?

你可能会问“为什么这个家伙需要这种奇怪的方式来生成对象?” ,答案是:在我的代码中,成员/字段名称可能会更改,默认值将被复制,唯一的区别是对成员名称的引用,并且我不想在每个键值对中定义数字值两次,因此我寻求一种在值定义中反向引用名称的方法。

Nin*_*olz 2

您正在寻找 ES6 功能,Proxy

Proxy对象用于定义基本操作的自定义行为(例如属性查找、赋值、枚举、函数调用等)。

然后使用prop实际密钥并将占位符替换{key}为实际密钥。

var obj = {
        1: "you selected {key}",
        2: "wow, you selected {key}",
        3: "this time, you selected {key}",
        137: "I think you've chosen {key} this time.",
        513: "{key} is the answer!"
    },
    p = new Proxy(obj, {
        get: function(target, prop) {
            return target[prop] && target[prop].replace("{key}", prop);
        }
    });

console.log(p[3]);          // this time, you selected 3
console.log(p[137]);        // I think you've chosen 137 this time.
console.log(p[513]);        // 513 is the answer!
obj.foo = 'This is {key}!'; // create new property foo
console.log(p.foo);         // This is foo!
obj.bar = obj.foo;          // assign foo to bar
delete obj.foo;             // delete foo
console.log(p.foo);         // undefined
console.log(p.bar);         // This is bar!
Run Code Online (Sandbox Code Playgroud)