代码之家  ›  专栏  ›  技术社区  ›  Tom Regner

使只读对象包装成为傻瓜式的

  •  0
  • Tom Regner  · 技术社区  · 7 年前

    我使用以下代码为对象生成只读包装

    function readOnlyObject(obj) {
        return new Proxy(obj, {
            defineProperty: function(obj, key, desc) {return;},
    
            set: function(obj, prop, val) {return;},
    
            deleteProperty: function(obj, prop) {return;},
    
            get: function(obj, prop, receiver) {
                if (obj[prop] instanceof Object) {
                   return readOnlyObject(obj[prop]);
                }
                return Reflect.get(...arguments);
            }
        });
    }
    

    这不是关于来自外部威胁的安全问题,而是为了防止我和我的同事在路上开枪打自己的脚。是否有一个我忘记覆盖的代理函数,当代理对象被传递和写入时可能会导致问题?

    说明:所讨论的对象被传递给运行时生成的业务逻辑代码——由非程序员在DSL中编写,并翻译成javascript;我必须保护这个物体不被弄错。根据需要传递包含的数据的副本会很麻烦,因为每次businesslogic有新需求时,都需要接触并部署后端代码。

    1 回复  |  直到 7 年前
        1
  •  -1
  •   Nikko Khresna    7 年前

    sssstttttt。。。。。。有这个 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze

    但你甚至无法向冻结对象添加属性。

    --意见部分--

    老实说,我不知道你在做什么。你在阻止自己成熟。我从来没有这样做过,也不需要它,不管是什么因素。因为对我来说,不管是谁做的,都犯了一个和过度编写全局对象属性一样可怕的错误。