实现Object.seal,Object.freeze,Object.preventExtensions的替代方法

时间:2016-05-23 09:15:45

标签: javascript node.js ecmascript-6

我需要以下功能。我想冻结对象的现有属性,但允许添加新属性。出于某种原因,似乎没有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之前以某种方式停止。

1 个答案:

答案 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;
};