【问题标题】:Is it possible to control how object property names get converted to strings in JavaScript?是否可以控制对象属性名称如何在 JavaScript 中转换为字符串?
【发布时间】:2018-03-07 22:56:40
【问题描述】:

我有兴趣创建一个对象,该对象可以分别处理不同类型的键,而不是将它们全部转换为字符串。我想知道是否有办法使用代理或任何其他相对较新的 JavaScript 功能来做到这一点。如果我做类似的事情

const handler = {
    get: function(target, name) {
        return typeof(name);
    }
};
const proxy = new Proxy({}, handler);

然后尝试访问proxy[1] 它返回string 作为类型。我理解为什么会发生这种情况,但我很好奇是否有任何方法可以连接到这种类型转换并控制它。我知道我可以覆盖Number.prototype.toString,但我想在处理属性名称时修改此行为。理想情况下,我想要与此类似的东西。

const handler = {
    convertPropertyNameToString: function(target, name) {
        return `${typeof(name)}--${name}`;
    }
};
const proxy = new Proxy({}, handler);

我只想控制将属性名称转换为特定对象的字符串。如果没有直接的方法来做到这一点,那么我也愿意接受创造性的黑客攻击。

【问题讨论】:

  • 所以你是说如果proxy[someObject] 发生了什么事情,你希望能够实现自定义逻辑,将someObject 转换为专门用于proxy 的字符串?
  • 是的,完全正确。不过,它不一定是代理,任何允许这样做的东西都会很棒。我只是假设代理是最有可能的答案。
  • 你见过Map接受基于对象的键吗?
  • @naomik,谢谢,我不知道 Map 对象可以除了不同类型的键。有没有办法在自定义类中实现相同的功能?
  • @Ivanna 当然。在this answer 中,我们创建了一个自定义键值数据类型。那里的示例使用了对列表,但 binary tree 会提供更快的查找

标签: javascript ecmascript-6 properties proxy


【解决方案1】:

具有正常的属性访问权限,例如foo.barfoo[thing],在对象本身甚至知道有访问到来之前,密钥就被转换为字符串。代理上的get 陷阱仅在该点之后才能访问它,因此可以保证是字符串或符号。

如果您有兴趣,您可以看到in the spec for property access 在第(6)步中它被转换为字符串。实际访问该属性的逻辑直到很久以后才会发生,并且不知道字符串化键的来源。

你能做的最好的就是使用你自己的函数,例如proxy.readKey(name) 显然 name 可以是任何值。如 cmets 中所述,这类似于用于 ES6 Map 实例的接口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    相关资源
    最近更新 更多