在javascript中学习OO:错误-无法读取未定义的属性

在javascript中学习OO:错误-无法读取未定义的属性,javascript,Javascript,我相信我忽略了我正在做的事情。我试着玩一些东西,玩一些有趣的东西,但我陷入了这个奇怪的错误。我在C++/C#中使用过OO 我创建了一个游戏环境对象,它将包含关于这个游戏的所有信息 然后,我创建了一个验证工具(对象),其中包含有效输入的regex测试,在该工具中,我调用并传递到,然后返回测试结果 使用这些对象,我创建了一个launch()提示用户输入用户名并使用工具进行验证的函数。就是在这个电话里,我遇到了这个错误 考虑到这个bug,我不确定我所做的在JS中是否合法。 launch(); 函数启动

我相信我忽略了我正在做的事情。我试着玩一些东西,玩一些有趣的东西,但我陷入了这个奇怪的错误。我在C++/C#中使用过OO

我创建了一个游戏环境对象,它将包含关于这个游戏的所有信息

然后,我创建了一个验证工具(对象),其中包含有效输入的regex测试,在该工具中,我调用并传递到,然后返回测试结果

使用这些对象,我创建了一个
launch()提示用户输入用户名并使用工具进行验证的函数。就是在这个电话里,我遇到了这个错误

考虑到这个bug,我不确定我所做的在JS中是否合法。
launch();
函数启动(){
var userNameInput=prompt(“请输入您的姓名:”,“用户名”);
if(gameEnv.player(userNameInput)){
警告(“请仅输入用户名的字母。”);
位置。重新加载(true);
}
}
变量gameEnv={
playerName:“,
设置播放器(输入){
if(validationTool.LetterValidator(输入)){
this.playerName=输入;
返回1;
}否则{
返回0;
}
},
}
var validationTool={
letterOnlyValidation://^[a-zA-Z^\s]+$/,,
LetterValidator:函数(输入){
返回单验证测试(输入);
},

}
首先,除非您需要与较旧版本的JavaScript兼容,否则ES6JavaScript具有可用于OO的实际
声明

即使使用较旧的JS,创建类实例的方法也是使用
函数定义它,并使用
new
创建新实例

此处特定代码的问题:

var gameEnv = {
  playerName: "",
  set player(input) {
    if (validationTool.LetterValidator(input)) {
      this.playerName = input;
      return 1;
    } else {
      return 0;
    }
  },

}
…就是你已经用
set
player
定义了一个setter,但是没有getter,所以player可以被设置,但是不能被读回

此外,由于此对象没有使用
new
正确创建为类实例,因此这里的
this
指的是全局
this
,而不是对象本身。

这里有几个问题:

  • set语法绑定一个对象属性,应该使用
    =
    来赋值
  • 秩序问题
var gameEnv={
playerName:“,
设置播放器(输入){
if(validationTool.LetterValidator(输入)){
this.playerName=输入;
警报(“玩家名称集”);
}否则{
警告(“请仅输入用户名的字母。”);
}
},
}
var validationTool={
letterOnlyValidation://^[a-zA-Z^\s]+$/,,
LetterValidator:函数(输入){
返回此.letterOnlyValidation.test(输入);
},
}
发射();
函数启动(){
var userNameInput=prompt(“请输入您的姓名:”,“用户名”);
gameEnv.player=用户名输入;

}
将要启动的调用移动到下面,在这里初始化gameEnv变量
letterOnlyValidation
应该是
这个。letterOnlyValidation
从setter返回不同的值(
设置播放器(输入)
)?这是行不通的。我在遵循一些关于如何在JS中创建对象的教程时,遇到了这样一个问题:在其中,他们使用这个“对象文字”创建了一个对象(尽管在查看ES6之后,我切换到了ES6),而他们只有一个带有
set
的setter。我确实理解没有getter它不会被读回,但这纯粹是为了实验目的。不,
这个
工作正常。当您使用
new
创建对象时,方法的
this
没有什么神奇之处
var gameEnv={set player(输入){console.log(this);};gameEnv.player=“测试”
@Robolisk您刚刚获得了第一人称体验,为什么不应该使用w3schools.com。那个网站上有很多不正确的信息。