Javascript 如何防止访问尚不存在的对象属性

Javascript 如何防止访问尚不存在的对象属性,javascript,Javascript,我经常遇到这种情况: var obj={field:2} 在守则中: 做某事(obj.fiel);//注意:字段拼写错误 属性键入错误。我想尽早发现这些bug 我想把这个东西封起来 obj=Object.seal(obj) 但这似乎只能防止像obj.fiel=2这样的错误且仅读取字段时不会引发错误 有没有办法锁定对象,以便检测并抛出对丢失属性的任何读取访问 谢谢, 保罗 编辑:有关情况的更多信息 纯javascript,没有编译器 没有经验的程序员用于数学计算的库。我想限制他们的错误。我可以发现

我经常遇到这种情况:

var obj={field:2}

在守则中:

做某事(obj.fiel);//注意:字段拼写错误

属性键入错误。我想尽早发现这些bug

我想把这个东西封起来
obj=Object.seal(obj)

但这似乎只能防止像
obj.fiel=2这样的错误且仅读取字段时不会引发错误

有没有办法锁定对象,以便检测并抛出对丢失属性的任何读取访问

谢谢, 保罗

编辑:有关情况的更多信息

  • 纯javascript,没有编译器
  • 没有经验的程序员用于数学计算的库。我想限制他们的错误。我可以发现一个错误的变量,但他们不能
  • 希望尽早检测尽可能多的错误。ie在编译时(最好),在运行时遇到拼写错误时立即抛出错误(ok),或者在分析结果和发现不正确的计算输出时抛出错误(非常糟糕)
  • 单元测试实际上不是一种选择,因为数学的目的是发现新的知识,因此数学的答案通常是事先不知道的。同样,没有经验的程序员很难教他们单元测试

  • 我认为这在Javascript中不起作用,因为对象是像JSON一样编写的,因此属性将是未定义的或空的,但不会抛出错误

    解决方案是编写本机getter/setter

    var obj = {
        vars: {},
    
        set: function(index, value) {
            obj.vars[index] = value;
        },
    
        get: function(index) {
            if (typeof(vars[index]) == "undefined") {
                throw "Undefined property " + index;
            }
    
            return vars[index];
        }
    };
    

    目前javascript中没有可靠的getter/setter。你必须手动检查。下面是一种方法:

    if (!('key' in object)) {
        // throw exception
    }
    

    请注意,对未定义变量的任何取消引用都是类型错误。您是在开发期间还是在运行时尝试检测此错误?如果您正在寻找编译ish类型的静态工具,请查看Typescript。对于响应延迟,很抱歉,限制在主要问题中,这不是真的,请看这个小把戏:当您使用不存在的属性时,Javascript不会抛出错误。如果将未定义的属性用作对象,它将抛出错误,例如:obj.test不会抛出错误。然而,obj.test.x将从顶部。。。alex23-我不需要try/catch块,因为我希望它抛出并死掉,所以错误将被检测到,并且不会被忽略,特别是在开发过程中。在运行时,用户也会报告问题。然而,obj.test.y(其中y不存在)不会抛出。不幸的是。那太好了,你不觉得吗?最后,我认为这是首选的答案,但有两个问题:1。性能,虽然没有我想象的那么差:2。干净的代码。没有经验的程序员不想键入obj.get('x')而不是obj.x,这会使代码更难阅读。但是,我看不到任何其他方式,所以这就是答案!谢谢:)这将是一个巨大的打字和性能成本:(我在寻找打字错误检测,而不是明确的检查。谢谢你,布莱恩,这与迪伦的答案相似,但速度慢了很多,请看:非常酷,你在上面做了一个jsperf。我从来没有意识到in操作符这么慢。很高兴看到