无法初始化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全球范围内有一个很好的解释。