若语句在函数中有效,但在setter方法中无效,反之亦然,那个么setter也根本不起作用



我正在CodeCademy上做一个项目,我需要为许多学生创建一个setter方法。它应该检查该值是否为数字,如果是,则返回该值,否则记录错误。我最初想出了这个代码

set numberOFStudents(val) {
if(typeof val === 'number') {
this._numberOfStudents = val;
} else {
console.log('Invalid input: numberOfStudents must be set to a Number.') 
}
} 

但它没有起作用,因为价值没有影响。它将同时返回字符串和数字作为值。然而,当我在正则函数中使用此方法时,它可以完美地工作https://jsfiddle.net/Montinyek/v8zsL5et/12/演练中使用的方法是:

set numberOfStudents(val) {
if(val.isNaN()) {
console.log('Invalid input: numberOfStudents must be set to a Number.')
} else {
this._numberOfStudents = val;
}
}

它在常规函数中不起作用,因为它返回错误https://jsfiddle.net/Montinyek/e6k7qdcs/但更让我困惑的是,演练中使用的方法似乎也没有效果。我仍然可以将学生人数设置为字符串,它会记录它,而不是记录错误。这是整个代码的jsfiddlehttps://jsfiddle.net/Montinyek/1j7wL5gm/

这是因为您没有在构造函数中使用setter。因此,当你传入字符串时,它会分配它。

您需要更改

constructor(name, level, numberOfStudents) {
this._name = name;
this._level = level;
this._numberOfStudents = numberOfStudents;
}

constructor(name, level, numberOfStudents) {
this._name = name;
this._level = level;
this.numberOfStudents = numberOfStudents;
}

因此它使用setter而不是成员变量。第一个中的方法直接将其分配给您的成员,而不是使用setter。

以下是根据您的示例进行更改的完整代码;

class School {
constructor(name, level, numberOfStudents) {
this._name = name;
this._level = level;
this.numberOfStudents = numberOfStudents;
}
get name() {
return this._name;
}
get level() {
return this._level;
}
get numberOfStudents() {
return this._numberOfStudents;
}
set numberOfStudents(val) {
if(typeof val !== 'number') {
console.log('Invalid input: numberOfStudents must be set to a Number.')
} else {
this._numberOfStudents = val;
}
}
quickFacts() {
console.log(`${this.name} educates ${this.numberOfStudents} students at the ${this.level} school level.`)
}
static pickSubstituteTeacher(substituteTeachers) {
const randInd = Math.floor(Math.random() * substituteTeachers.length)
return substituteTeachers[randInd];  
}   
}
class PrimarySchool extends School {
constructor(name, numberOfStudents, pickupPolicy) {
super(name, 'primary', numberOfStudents)
this._pickupPolicy = pickupPolicy;
}
get pickupPolicy() {
return this._pickupPolicy;
}
}
class HighSchool extends School {
constructor(name, numberOfStudents, sportsTeams) {
super(name, 'high', numberOfStudents)
this._sportsTeams = sportsTeams;
}
get sportsTeams() {
return this._sportsTeams;
}
}
const lorraineHansburry = new PrimarySchool('Lorraine Hansbury', 'g', 'Students must be picked up by a parent, guardian, or a family member over the age of 13.');
lorraineHansburry.quickFacts();
const alSmith = new HighSchool('Al E. Smith', 415, ['Baseball', 'Basketball', 'Volleyball', 'Track and Field'])
alSmith.quickFacts();

这是保存的jsfiddle显示其工作

https://jsfiddle.net/6qoadu27/6/

最新更新