我正在寻找一种冻结原生 ES6 地图的方法。
Object.freeze https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze and Object.seal https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/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
and maps
are no objects
或者这可能是一个错误/尚未实现?
是的,我知道,我可能应该使用不可变.js https://facebook.github.io/immutable-js/,但是有什么方法可以使用原生 ES6 地图来做到这一点吗?
没有,您可以编写一个包装器来做到这一点。Object.freeze
锁定对象的属性,但是 whileMap
实例是对象,它们存储的值不是属性,因此冻结对它们没有影响,就像隐藏内部状态的任何其他类一样。
在支持扩展内置函数的真实 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
class.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)