无法初始化JavaScript Class来命名关键字

var NameOne = function (firstName, lastName) { this.firstName = firstName; this.lastName = lastName; } NameOne.prototype.getName=function(){ console.log(this.firstName+' '+this.lastName); } var name = new NameOne('Prashant','Jain'); name.getName(); 

错误

Uncaught TypeError:name.getName不是一个函数

如果将对象命名为名称并在浏览器上运行,则会在浏览器中出现以上错误。 它在nodejs上工作正常。

window.name是浏览器中的getter / setter样式属性,它将所有内容都转换为String (作为Window名称

因此变化它不工作,因为你期望,你最终

 name; // "[object Object]" 

你也需要

  • select一个不同的标识符来避免这种冲突
  • 在全球范围以外的范围工作,所以var将为name工作

这是因为在JavaScript名称是内置属性。 所以当你调用name.getName()它实际上会在全局窗口对象上调用,如下面的window.name.getName()会抛出一个错误。 您需要select除“名称”以外的其他标识符才能正常工作。

在浏览器中,全局范围是指window对象,它有一个名为name的属性。

如果您阅读了JavaScript中的范围界定,例如在W3School中 ,您可以在页面底部find这些信息:

您的全局variables(或函数)可以覆盖窗口variables(或函数)。 任何函数,包括窗口对象,都可以覆盖你的全局variables和函数。

这意味着,如果你试图定义任何已经存在的作为全局window对象成员的variables或函数,你将无法做到这一点。 当您尝试访问它们时,您将访问全局window对象成员。

您可以在创build对象name === window.name后检查它是否正确name === window.name生成true,这意味着它不是您的对象,而是window.name属性。

你也可以检查,只要你在全局范围内创build一个var,它就被创build为一个窗口的成员。 即

 var x = 22; window.hasOwnProperty('x'); // returns true console.log(window.x); // you'll see 22 in your console 

要摆脱这个问题,你需要确定你的variables的范围。 JavaScript只在函数的主体中创build新的作用域。 所以,创build自己的作用域的一种方法是使用“自动执行匿名函数”模式,如下所示:

 (function(){ /* new scope: variables are created here without window global object * interference. You can still access globlas using window.globalName */ })(); 

你可以在这里阅读这个模式的一篇有趣的文章。

在node.js中,在全局范围中没有name ,所以你没有这个问题。 在这个伟大的答案中有什么是在node.js全球范围内有一个很好的解释。