JavaScript:防止无意中创建新属性

JavaScript:防止无意中创建新属性,javascript,error-detection,Javascript,Error Detection,拼写错误时有发生,有时很难在JavaScript中找到它们。以这个为例(想象一下它在更多代码之间): 对于未声明的变量,严格模式有助于: "use strict"; var myHTML = "foo"; myHtml = "bar"; // -> error 但对于上面的例子,它不起作用。是否有一个程序或模式可以捕获这些bug?我尝试了JSLint和JavaScript Lint,但他们没有捕获它 理想情况下,我希望这仍然有效(没有警告): 这就是动态类型编程语言的价格。因为可以在运行

拼写错误时有发生,有时很难在JavaScript中找到它们。以这个为例(想象一下它在更多代码之间):

对于未声明的变量,严格模式有助于:

"use strict";
var myHTML = "foo";
myHtml = "bar"; // -> error
但对于上面的例子,它不起作用。是否有一个程序或模式可以捕获这些bug?我尝试了JSLint和JavaScript Lint,但他们没有捕获它

理想情况下,我希望这仍然有效(没有警告):


这就是动态类型编程语言的价格。因为可以在运行时添加属性,所以没有检测代码中键入错误的真正解决方案

但是,您可以将
innerHtml
函数添加到
元素
原型中,在内部调用
innerHtml
,以消除某些打字错误,但我绝对不建议这样做


正如其他评论已经建议的那样:一个好的IDE可以帮助您识别拼写错误。我只使用WebStorm和VisualStudio,它们都能够检测未声明或未使用的函数。

使用像WebStorm这样的IDE可以帮助检测此类错误

为了防止意外地向对象添加特性,可以冻结对象:

使用ES6,您可以使用代理检测以下错误:

我不明白您为什么希望在第一个示例中显示警告。有什么问题吗?编辑:好的,我知道了it@Larta它不能正常工作
innerHTML
。但这很难检测到,因为它看起来很像
innerHtml
。似乎不可能在没有任何脏代码的情况下连接此类错误。我的意思是,您可以为某些属性定义setter/getter,但不能为所有属性定义setter/getter。您必须创建一个包含所有可能的拼写错误的数组,然后检查它们是否已设置(使用_defineSetter__()),或者创建一个超类,包装对象类。然后,您将拥有名为“set”和“get”的函数,每次访问属性时都会调用这些函数。这些函数将检查属性是否存在(并告诉您何时不存在)。但如果不是自己创建的,这会给obj带来问题。请区分变量(范围中声明的
var
事物)和属性(对象的属性)。但是,由于无法声明属性(除非您使用TypeScript或其他类型),这似乎很难实现。有一点可以帮助您在IDE或其他能够自动完成属性名称的编辑器(如大多数浏览器中的JavaScript控制台)中工作。当然,这可能不适用于第一个示例这样的情况,因为IDE可能不够聪明,无法知道对象
document.getElementById()
将返回什么类型的对象。OTOH,如果您已经将元素保存在变量
elem
中,那么至少Firefox JS控制台(刚刚测试过)足够聪明,可以在您键入
elem.inn
freeze
时建议
elem.innerHTML
,这不仅可以阻止我添加属性,还可以阻止我更改现有属性<另一方面,code>seal似乎与我要找的很接近。但是它不适用于dom对象。使用IDE也是一个好主意。我尝试了NetBeans(因为它是免费的),它可以自动完成,这可以防止这些错误。但它无法在现有代码中检测到它们。请尝试一下WebStorm。你会被吹走的;)
"use strict";
var myHTML = "foo";
myHtml = "bar"; // -> error
// should work (without warning)
function MyClass(arg) {
  this.myField = arg;
}