无法将JavaScript类初始化为name关键字

时间:2015-10-08 11:09:16

标签: javascript node.js

        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();

错误

  

未捕获的TypeError:name.getName不是函数

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

3 个答案:

答案 0 :(得分:3)

List<String> newList = new ArrayList<String>(listOne); newList.addAll(listTwo); 是浏览器中的getter / setter样式属性,可将所有内容转换为 String (成为 Window 名称 >)

因此window.name它不能按预期工作,最终会以

结束
var

你需要

  • 选择其他标识符以避免此冲突
  • 在全球范围以外的范围内工作,因此name; // "[object Object]" 适用于var

答案 1 :(得分:2)

这是因为javascript名称是内置属性。因此,当您调用name.getName()时,它实际上将在全局窗口对象上调用,如下所示 window.name.getName()会抛出错误。除了&#39; name&#39;之外,你需要选择不同的标识符。正确地工作。

答案 2 :(得分:1)

在浏览器中,全局范围引用window对象,该对象具有名为name的属性。

如果您在JavaScript中阅读过关于作用域的内容,例如在W3Schools中,您将找到此信息(位于页面底部):

  

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

这意味着,如果您尝试定义已作为全局window对象的成员存在的任何变量或函数,您将无法执行此操作。当您尝试访问它们时,您将访问全局window对象成员。

创建对象name === window.name后,您可以检查是否为true,这意味着它不是您的对象,而是window.name属性。

您还可以检查在全局范围内创建var时,它是作为窗口成员创建的。即。

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

要解决此问题,您需要确定变量的范围。 JavaScript只在函数体中创建新的范围。因此,创建自己的范围的一种方法是使用“自执行匿名函数”模式,如下所示:

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

您可以阅读有关此模式的有趣文章here

在node.js中,全局范围内没有name,因此您没有这个问题。对this great SO answer中的node.js全局范围有很好的解释。