javascript - 有没有办法卡住 ES6 map ?

标签 javascript hashmap ecmascript-6 immutability

我正在寻找一种卡住原生 ES6 map 的方法。

Object.freezeObject.seal似乎不起作用:

let myMap = new Map([["key1", "value1"]]);
// Map { 'key1' => 'value1' }

Object.freeze(myMap);
Object.seal(myMap);

myMap.set("key2", "value2");
// Map { 'key1' => 'value1', 'key2' => 'value2' }

这是预期的行为,因为卡住卡住了 objectsmaps 的属性不是 objects 或者这可能是一个错误/尚未实现?

是的,我知道,我可能应该使用 Immutable.js ,但是有什么方法可以用原生 ES6 map 做到这一点吗?

最佳答案

没有,你可以写一个包装器来做到这一点。 Object.freeze 锁定对象的属性,但是虽然 Map 实例是对象,但它们存储的值不是属性,因此卡住对它们没有影响,就像任何其他类一样隐藏了内部状态。

在支持扩展内置函数(不是 Babel)的真实 ES6 环境中,您可以这样做:

class FreezableMap extends Map {
    set(...args){
        if (Object.isFrozen(this)) return this;

        return super.set(...args);
    }
    delete(...args){
        if (Object.isFrozen(this)) return false;

        return super.delete(...args);
    }
    clear(){
        if (Object.isFrozen(this)) return;

        return super.clear();
    }
}

如果您需要在 ES5 环境中工作,您可以轻松地为 Map 创建一个包装类,而不是扩展 Map 类。

关于javascript - 有没有办法卡住 ES6 map ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35747325/

相关文章:

java - 如何使用 opencsv 将 csv 解析为按列分组的 hashmap

javascript - 在我的示例中如何将值插入数组?

java - 为什么 HashMap containsKey 在 Sun JDK 中比 get 慢? (太阳-jdk-1.6.0.17)

java - HashMap 中的值被新值覆盖 (Java)

javascript - 增强对象字面量中的对象解构

javascript - 在 ES6 中创建的每个新实例中传递单独的作用域

javascript - 如何过滤对象数组但更改顺序

javascript - 如何将javascript绑定(bind)到所有相关元素?

javascript - 使用显示 :none on Chrome 重置 GIF 动画的正确方法

javascript - 指令标题 AngularJS 不起作用