为什么构造函数(带“return this”)返回窗口对象?

时间:2014-08-09 01:55:03

标签: javascript this

我有一个功能

function Person(name){
this.name = name;
return this;
}
alert(Person("somename"));

这是返回[对象窗口],我们如何将其更改为[对象对象]?有没有什么办法可以改变这个函数来获取[对象对象]而不改变签名。

1 个答案:

答案 0 :(得分:1)

在Javascript中,当您调用函数时:

Person("somename")

该函数调用中的this指针设置为全局对象或undefined(如果以严格模式运行)。这就是你的陈述中发生的事情:

alert(Person("somename"));

如果您希望Person()作为构造函数自动为您创建新的Person对象,那么您必须包含new运算符,如下所示:

alert(new Person("somename"));

new运算符然后创建该类型的新对象,然后调用构造函数,并将this指针设置为该新对象。这正是它的用途。此外,在使用return this构造函数时,无需执行new,因为这是自动完成的。


您可以在不使用new的情况下使表单正常工作,但是您必须在Person函数中创建自己的对象,如下所示:

function Person(name){
    var p = {};      // create an empty object
    p.name = name;   // assign the name field
    return p;        // return the newly created object
}

这样做有一些缺点,特别是instanceof Person无法正常工作,因此通常首选使用new运算符。我发现使用new也可以使代码更具可读性,因为在创建新对象和刚刚调用函数时它更明显。