You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript上下文与this指向问题:构造函数传值异常求助

问题分析与解决方案

看起来你踩了两个常见的this和函数调用的坑,咱们一步步拆解解决:

核心问题根源

你的Person函数现在有两个关键问题:

  1. 完全忽略了传入的参数:函数里一直在尝试从this上读取username、Title等属性,但这些属性根本没被定义,反而把开头传入的personName、Title等参数晾在了一边。
  2. 调用方式导致this指向错误:你直接用Person(...)的普通函数调用方式,在非严格模式下,这种调用的this会指向全局的window对象,而window上并没有你要的那些属性,所以最终返回的对象所有值都是undefined。

解决方案一:改成工厂函数(最简单直接)

既然你本来就是要返回一个对象,完全不需要依赖this,直接用传入的参数构建返回对象就行,这是工厂函数的标准写法:

function Person(personName, Title, Phone, Email, Id, picUrl, description){
    // 直接使用传入的参数赋值,彻底避开this的坑
    return {
        name: personName,
        Title: Title,
        phoneNumber: Phone,
        Email: Email,
        UserId: Id,
        PictureUrl: picUrl,
        Description: description
    }
}

这样不管你怎么调用Person(...),都会正确把传入的参数映射到返回对象里,完全不用考虑this的指向问题。


解决方案二:正确使用构造函数(如果想保留构造函数模式)

如果你想把Person作为构造函数使用,需要做两个关键修改:

  1. 在函数内部给this添加属性,构造函数默认会返回this,不需要手动返回对象
  2. 调用的时候必须用new关键字,这样this会指向新创建的实例对象

修改后的构造函数:

function Person(personName, Title, Phone, Email, Id, picUrl, description){
    // 给this绑定属性,此时this指向new创建的实例
    this.name = personName;
    this.Title = Title;
    this.phoneNumber = Phone;
    this.Email = Email;
    this.UserId = Id;
    this.PictureUrl = picUrl;
    this.Description = description;
    // 构造函数默认返回this,无需手动return
}

然后在getallDetails里调用时要加上new:

PeopleCompleteList.push(new Person(personName, UserTitle, UserphoneNumber, UserEmail, Id, picUrl, description));

额外小提示

在getallDetails函数里,你使用的personName、userName等变量都没有用let/const声明,会自动变成全局变量,建议加上声明避免污染全局环境:

let personName = data.d.results[i]['Name'].Name.split('|')[2];
let userName = data.d.results[i]['Name']['Name'];
// 其他变量同理添加let/const

内容的提问来源于stack exchange,提问作者GottiJay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:23:51