作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在寻找一种卡住原生 ES6 map 的方法。
Object.freeze
和 Object.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' }
这是预期的行为,因为卡住卡住了 objects
和 maps
的属性不是 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/
我是一名优秀的程序员,十分优秀!