Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法使用构造函数中的属性_Javascript_Es6 Class - Fatal编程技术网

Javascript 无法使用构造函数中的属性

Javascript 无法使用构造函数中的属性,javascript,es6-class,Javascript,Es6 Class,我正在创建两个ES js类(Person、Teacher) 班级人员{ 构造函数(name=“no name”){ this.name=name } 师承人 班主任扩展个人{ 构造函数(名称、学位){ 超级(姓名) 这个。度=度; } } 在教师构造函数中,我有一个名为degree的新属性 当我创建一个名为Full name的新属性时,该属性使用名称和度。度显示为未定义。虽然当我记录对象教师属性时,该属性存在。这看起来像是一个延迟问题。但是,我不应该立即访问该属性吗 班级人员{ 构造函数(

我正在创建两个ES js类(Person、Teacher)

班级人员{
构造函数(name=“no name”){
this.name=name
}
师承人

班主任扩展个人{
构造函数(名称、学位){
超级(姓名)
这个。度=度;
}
}
在教师构造函数中,我有一个名为degree的新属性

当我创建一个名为Full name的新属性时,该属性使用名称和度。度显示为未定义。虽然当我记录对象教师属性时,该属性存在。这看起来像是一个延迟问题。但是,我不应该立即访问该属性吗

班级人员{
构造函数(名称='无名称'){
this.name=名称;
}
}
班主任延伸人{
构造函数(名称、学位){
超级(姓名);
这个。度=度;
}
全名=this.degree+this.name;
printFullName(){
console.log(this.fullname);
}
}
let person=新教师(“亚当”、“女士”);
控制台日志(个人);

person.printFullName();//未定义的Adam
fullname
更新为a,以在访问时计算属性值:

class Teacher extends Person {
  constructor(name, degree) {
    super(name);
    this.degree = degree;
  }

  get fullname() {
    return this.degree + this.name;
  };

  printFullName() {
    console.log(this.fullname);
  }
}

听起来你想让fullname成为一个属性,那么为什么不在构造函数中设置它呢

class Teacher extends Person {
  constructor(name, degree) {
    super(name);
    this.degree = degree;
    this.fullname = this.degree + this.name;
  }

  printFullName() {
    console.log(this.fullname);
  }
}
否则,只需更改
printFullName
即可为您完成以下工作:

  printFullName() {
    console.log(this.degree + this.nam);
  }

希望这会有所帮助!

这是在以下文件中指定的行为:

公共实例字段在基类中的构造时(在构造函数主体运行之前)或在子类中的
super()
返回之后添加
Object.defineProperty()

您的代码示例在第二种情况下。执行顺序如下:

  • 如果类是子类,则执行
    super()
  • 在此上定义公共实例字段
  • 执行构造函数的其余部分

  • 如果需要解决方法,则不要使用字段语法定义
    fullname
    ,而是将
    this.fullname
    指定为构造函数的一部分。

    没有此类字段this.fullname该字段称为“name”是什么让你认为你可以像这样在类上定义
    fullname
    这样的东西?你打算使用类似的东西吗?fullname是name和degree的新字段组合,就像我在类中定义的任何其他属性,它们不是在构造函数中直接定义的一样@AlexanderStaroselsky@trincot只是补充说没有作为属性/字段执行的方法?是的:如果您询问为什么
    undefined
    也被注销,这是因为
    printFullName
    不返回任何内容,所以基本上它执行的是
    console.log(undefined)
    您可以在构造函数中设置它。否则,当度或名称更改时,您也需要更改全名。或者让printFullName为您组合值,而不是引用全名。有不同的方法可以解决此问题,包括构造函数、更改printFullName的工作方式或使用getter。您会选择哪种方法你更喜欢吗?PrintFullName不记录undefine它print undefined+Adam,所以只有度是未定义的