2016-01-31 50 views
3

我觉得Javascript试图杀死我。编译器在任何静态类型语言(包括FORTRAN)中捕获的错误,或在任何体面的动态类型语言中变成运行时异常的错误都会被Javascript静静地吞噬,耐心地等待在其他地方显示为错误。访问未定义对象属性时的Javascript通知

每当我们编写前端代码(现在有了Angular),我们大部分时间都在搜索错误,如编写$scope.result = data.results而不是data.result。虽然有些工具可以提供帮助,但仍需要大量的工作。

有没有办法让JavaScript环境(在浏览器中)在有人试图读取不存在的对象属性时记录警告?我不想改变语言的语义 - 访问data.results仍然应该返回undefined,我只是想在控制台上看到一条警告,声明“不存在访问的属性,文件...行...”。

+0

试过'try..catch'? – guest271314

+0

在对象中访问不存在的属性不会引发任何异常,它只是返回'undefined'。我该怎么抓? – zmbq

+0

我总是可以切换到TypeScript。我可能没有选择...... – zmbq

回答

0

这看起来可能是业余的,但是您可能能够将所有变量存储在循环对象中,例如数组或对象,然后遍历它们以检查它们中的任何一个是否为undefined,然后打印该结果。您可能可以使用key:value对的字典。虽然不理想。

+0

我希望这样做是“自动”完成的,不需要对代码进行重大更改。人们应该像往常一样继续编码。 – zmbq

+0

是的,我认为这可能是一个问题。 –

1

在ECMAScript中2015年,您可以使用Proxy要做到这一点,例如:

function createObject(obj) { 
    const handler = { 
     get: function(target, name){ 
      if (name in target) { 
       return target[name]; 
      } else { 
       console.warn("accessing undefined object property: " + name); 
       return undefined; 
      } 
     } 
    }; 
    return new Proxy(obj, handler); 
} 


let a = createObject({ 
    b: 1, 
    c: undefined 
}); 

a.b; 
a.c; 
a.d; // accessing not existing object property: d 
+0

所以我需要用这个代理来包装每个对象(有些是由外部代码如Angular创建的)。这并不坏!如果它是最简单的解决方案,我会先尝试Firefox设置。 – zmbq