繁体   English   中英

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

[英]Unable to initialize JavaScript Class to name keyword

        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上运行正常。

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

因此var荷兰国际集团,你期望它不工作,你结束了

name; // "[object Object]"

您将需要

  • 选择其他标识符以避免此冲突
  • 在全局范围之外的范围内工作,因此var将为name工作

这是因为javascript名称是内置属性。 因此,当您调用name.getName() ,它将实际在window.name.getName()下面的全局窗口对象上调用,这将引发错误。 您需要选择除“名称”以外的其他标识符才能正常工作。

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

如果您阅读了有关JavaScript范围定义的信息,例如W3Schools中的信息 ,您将在页面底部找到以下信息:

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

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

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

您还可以检查是否在全局范围内创建var时是否将其创建为window的成员。

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 */ 
})();

您可以在此处阅读有关此模式的有趣文章。

在node.js中,全局作用域中没有name ,因此您没有这个问题。 这个很棒的SO答案中 ,对node.js全局范围中的内容有很好的解释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM