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

JavaScript构造函数内访问数据失效问题求助

我明白你遇到的问题了——在类的构造函数里定义的Login方法中,没法正常访问你初始化的Username、Password这些实例属性,运行时提示未初始化对吧?这其实是函数中this的指向问题导致的。

问题根源

当你用普通函数表达式function()来给this.Login赋值时,这个函数的this绑定是动态的:它的指向取决于函数被调用时的上下文,而不是构造函数里的类实例。如果调用Login时的上下文不对,this就会指向全局对象(非严格模式)或者undefined(严格模式),自然找不到你在构造函数里初始化的那些属性。

两种解决方案,都能让你把Login留在类内

方案1:用箭头函数定义Login方法

箭头函数不会创建自己的this,它会“继承”所在上下文(也就是构造函数执行时的this,也就是类的实例)的this值,这样在Login里访问实例属性就不会出问题了:

class dLoginPage {
  constructor() {
    this.Username = Aliases.browser.page_General_Login.formLoginform.textboxUsernameinput;
    this.Password = Aliases.browser.page_General_Login.formLoginform.passwordboxPasswordinput;
    this.SubmitButton = Aliases.browser.page_General_Login.formLoginform.submitbuttonLogin;
    
    // 改用箭头函数
    this.Login = () => {
      this.Username.SetText("admin");
      this.Password.SetText("admin");
      this.SubmitButton.ClickButton();
    }
  }
}

module.exports = dLoginPage;

方案2:把Login定义为类的原型方法(推荐)

这是ES6类的标准写法,方法会被添加到类的原型上,调用时this会自动指向类的实例。这种写法更符合类的设计规范,还能节省内存(所有实例共享同一个方法,不用每个实例都创建新的函数副本):

class dLoginPage {
  constructor() {
    this.Username = Aliases.browser.page_General_Login.formLoginform.textboxUsernameinput;
    this.Password = Aliases.browser.page_General_Login.formLoginform.passwordboxPasswordinput;
    this.SubmitButton = Aliases.browser.page_General_Login.formLoginform.submitbuttonLogin;
  }

  // 直接在类内定义原型方法
  Login() {
    this.Username.SetText("admin");
    this.Password.SetText("admin");
    this.SubmitButton.ClickButton();
  }
}

module.exports = dLoginPage;

两种方案都能解决你的问题,更推荐第二种,它是ES6类的常规用法,代码也更整洁易维护。

内容的提问来源于stack exchange,提问作者A.Mills

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:40:39