我需要以下功能。我想冻结对象的现有属性,但允许添加新属性。出于某种原因,似乎没有Object.freezeExisting()功能,我认为实现它可能是值得的,可以选择冻结原型的现有属性。
我不知道该怎么做。这是一些入门的代码,但这根本不是正确的。我不太关心性能,只需要100%工作。
Object.freezeExistingProps = function(obj, modifyProto){
Object.keys(obj).forEach(function(key){
const val = obj[key];
Object.defineProperty(obj, key , { //we simply overwrite existing prop
value: val,
writable: false, // important, I think
enumerable: true,
configurable: false
});
});
return obj;
};
但我只需要对上述内容进行健全检查。我还需要一些关于如何在原型链中运行的信息,并在弄乱实际的Object.prototype之前以某种方式停止。
答案 0 :(得分:3)
您可以轻松实现setIntegrityLevel algorithm而无需自行阻止扩展程序:
Object.freezeExisting = function(o) {
for (const key of Reflect.ownKeys(o)) {
const desc = Object.getOwnPropertyDescriptor(o, key);
if (!desc)
continue;
if ("value" in desc)
Object.defineProperty(o, key, {configurable: false, writable: false});
else
Object.defineProperty(o, key, {configurable: false});
}
return o;
};