我正在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/