【发布时间】: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