在没有新关键字

时间:2017-04-08 10:33:00

标签: javascript node.js class

我使用像

这样的函数创建了一个类



function Person(name) {
  this.name = name;
}

var obj = new Person("Ferdinand");

console.log(obj.name);




我正在创建一个对象obj并打印它的属性名称它工作正常并打印" Ferdinand",但是如果我们忘记写下如下程序的新关键字 -



function Person(name) {
  this.name = name;
}

var obj = Person("Ferdinand");

console.log(name);




在这里,我无法理解为什么名称在控制台中可用,它是打印" Ferdinand"。但是我们使用Person作为函数并在函数本身中分配名称变量,以便为什么它的值在函数外可用。

1 个答案:

答案 0 :(得分:2)

JavaScript没有实现经典意义上的对象。相反,它们是直接实现的:

var thing={};   //  new object

因为您通常希望多个对象遵循常见的模式和行为,所以您可以使用所谓的构造函数函数来提供帮助。在您的示例中,Person是构造函数。

使用构造函数时,使用new命令将其称为间接

var thing = new Person(…);

事实上,这里有很多魔术:

  • JavaScript首先创建一个新对象:var thing={};
  • 然后将this关键字分配给新对象
  • 最后运行构造函数,使用this值分配本地值。

如果直接调用构造函数 ,前两个步骤不适用,并且该函数试图在其自己的this定义中工作,这通常不是你的想。

如果你真的想在不打扰new的情况下调用构造函数,可以尝试以下方法:

function Person(data) {
    //  “new” safe constructor
    if(!(this instanceof Person)) {
    return new Person(data);
}

这个新版本会检查它是否被调用为正确的构造函数,如果没有,则会自动调用它。