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