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

Unable to initialize JavaScript Class to name keyword

本文关键字:name 关键字 初始化 JavaScript      更新时间:2023-09-26
        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不是函数

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

window.name是浏览器中的getter/setter样式属性,它将所有内容转换为字符串(作为窗口名称)

因此,var不像你期望的那样工作,你最终得到

name; // "[object Object]"

您需要

  • 选择不同的标识符以避免此冲突
  • 在全局作用域以外的作用域中工作,因此var将为name工作

这是因为在javascript中name是内置属性。所以当你调用name.getName()时,它实际上会在全局窗口对象上被调用,如下所示window.name.getName()会抛出一个错误。你需要选择不同的标识符,而不是"name"来正常工作。

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

如果你读过JavaScript的作用域,例如在W3Schools,你会发现这个信息(在页面底部):

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

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

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

你也可以检查当你在全局作用域中创建一个变量时,它是作为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,因此您没有这个问题。