gpt4 book ai didi

javascript - 属性访问器与映射集方法

转载 作者:行者123 更新时间:2023-11-29 23:01:48 25 4
gpt4 key购买 nike

有没有办法让下面的代码要么

  1. m[k] = v
  2. 上引发错误
  3. 调用 m[k] = v 自动转换为 m.set(k, v)

如果可能的话,我更喜欢解决方案 1。

// Imagine I write that somewhere
const m = new Map();
m.set("a", "alice");

// And at some point someone else write:
m["b"] = "bob"; // m = Map { 'a' => 'alice', b: 'bob' }
// Expecting "bob" to appear here:
for (const [k, v] of m){
console.log(k, v);
}

请注意,当我说其他人时,这个其他人在不久的将来可能就是我。理想情况下,我希望有一个只修改实例化 const m = new Map() 的解决方案。例如 const m = safe(new Map())

最佳答案

为了防止添加属性,您可以使用:

 Object.freeze(map);

但是,这不会引发错误。为了能够在属性访问上抛出错误,您必须使用代理,但是由于这不能直接在 map 上工作(因为它们具有不会通过代理反射(reflect)的内部属性),您必须镜像所有方法在一个对象中,并在该对象上使用代理:

 function safe(map) {
return new Proxy({
get(k) { return map.get(k); },
set(k, v) { return map.set(k, v); }
// .... others
}, {
set() { throw new Error("property setter on Map"); }
});
}

您还可以捕获 Proxies getter 以直接链接到 map (尽管不确定副作用):

function safe(map) {
return new Proxy({ }, {
set() { throw new Error("property setter on Map"); },
get(target, prop, receiver) {
return typeof map[prop] === "function" ? map[prop].bind(map) : map[prop];
}
});
}

关于javascript - 属性访问器与映射集方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55459456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com