javascript - 为什么构造函数(带有 "return this")返回 window 对象?

标签 javascript this

我有一个函数

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

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

最佳答案

在 Javascript 中,当您调用函数时,如下所示:

Person("somename")

该函数调用中的 this 指针设置为全局对象或 undefined(如果在严格模式下运行)。这就是您的声明中发生的情况:

alert(Person("somename"));
<小时/>

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

alert(new Person("somename"));

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

<小时/>

您可以在不使用 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 还可以使代码更具可读性,因为当您创建新对象和仅调用函数时,它会更加明显。

关于javascript - 为什么构造函数(带有 "return this")返回 window 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25214535/

相关文章:

C++11 传递 'this' 作为 std::make_shared 的参数

javascript - 在 html 表单中的操作之前调用 javascript 函数

javascript - 使用 javascript 调用按键

javascript - 如何提取 TSV 文件中的信息并将其保存在 JavaScript 数组中?

javascript - 访问对象内属性的兄弟,onclick javascript

c++ - 检查调用者和参数是否相同

JQUERY:在.each循环中查找类

javascript - 使用 Charts.js 禁用动画

javascript - 如何在javascript中构建图形?

jquery - 在 jquery 多重选择器中使用 "this"