- Objective: - Breadcrumb: # 概念阐释 # 实例 # 相关内容 # 问题 1. class的命名与其他JS命名有什么不同? 2. 在方法中使用属性值时应注意什么? 3. 注意一下生成随机老师名字的解题思路; 4. 静态方法,实例如何调用 5. level参数只有固定的3个参数,如何在子类中填写?`constructor()` `super()`,为什么? # 问题答案 1. 首字母大写 2. 要用`this.-...` 3. 不知道怎么写可以从实例回推 4. 静态方法调用只能用类的名称 5. constructor中不写level参数了,因为constructor构造子类函数,在子类中没有这个参数,super中直接填写level所代表的字符,因为super调用的是父类的构造函数 ```js 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 } // 检查数据类型需要用typeOf,return实例的值存储到属性(变量)中 set numberOfStudents(inputs) { if(typeof inputs === number) { return this._numberOfStudents = inputs }else{ return 'Invalid input: numberOfStudents must be set to a Number.' } } //方法中不能用constructor的参数,只能是`this._`,否则会报错,没有被定义。🌟 quickFacts(){ return `SCHOOL ${this._name} educates ${this._numberOfStudents} students at the ${this._level} school level.`; } /*7 在.quickFacts()下创建一个名为pickSubstituteTeacher的【静态】方法。这个方法将接收一个参数,名为substituteTeachers。substituteTeachers参数将接收一个字符串数组。 在方法内部,随机生成一个整数,范围从0到substituteTeachers数组长度减1。使用这个数字来访问并返回在随机生成的索引处的代课老师。🌟*/ static pickSubstituteTeacher(substituteTeachers){ let randomIndex = Math.floor(Math.random()*substituteTeachers.length); return substituteTeachers[randomIndex]; } } // 子类 因为level可以替换为'primary''middle''high',所以不需要传递父类的level参数🌟 class Primary extends School { constructor(name,numberOfStudents,pickupPolicy) { super(name,'primary',numberOfStudents); this._pickupPolicy = pickupPolicy; } get pickupPolicy() { return this._pickupPolicy } } class Middle extends School { constructor(name,numberOfStudents) { super(name,'middle',numberOfStudents); } } class High extends School { constructor(name,numberOfStudents,sportsTeams) { super(name,'high',numberOfStudents); this._sportsTeams = sportsTeams; } get sportsTeams() { return this._sportsTeams; } } // 创建primary实例 const lorraineHansbury = new Primary('Lorraine Hansbury',514,'Students must be picked up by a parent, guardian, or a family member over the age of 13.'); console.log(lorraineHansbury); //15. 在实例lorraineHansbury调用.quickFacts(); console.log(lorraineHansbury.quickFacts()); //16. 调用静态方法,随机生成一个sub teacher🌟 console.log(School.pickSubstituteTeacher(['Jamal Crawford', 'Lou Williams', 'J. R. Smith', 'James Harden', 'Jason Terry', 'Manu Ginobli'])); //17. 创建 High 实例 const alSmith = new High('Al E. Smith',415,['Baseball', 'Basketball', 'Volleyball', 'Track and Field']); console.log(alSmith); console.log(alSmith.sportsTeams); /*创建一个中学班级 为每个班级添加更多属性(平均考试成绩,学校概况等) 创建一个名为SchoolCatalog的类,用于保存学校的集合。为小学、中学和高中创建一个SchoolCatalog的实例。*/ class SchoolCatalog { constructor(){ this._schools = [ ];//将每次添加的新学校push到这个数组里,和library添加评级一样 } get schools() { return this._schools; } addSchool(school){ return this._schools.push(school); } } // 创建不同级别的学校 let primarySchool = new Primary('Happy Primary', 300, 'Parents must pick up'); let middleSchool = new Middle('Happy Middle', 500); let highSchool = new High('Happy High', 700, ['Basketball', 'Football']); // 创建学校目录 let schoolCatalog = new SchoolCatalog(); // 将学校添加到目录中 schoolCatalog.addSchool(primarySchool); schoolCatalog.addSchool(middleSchool); schoolCatalog.addSchool(highSchool); // 验证 console.log(schoolCatalog.schools); ``` # 参考资料 - [School Catalogue](https://www.codecademy.com/journeys/full-stack-engineer/paths/fscj-22-front-end-development/tracks/fscj-22-javascript-syntax-part-iii/modules/wdcp-22-learn-javascript-syntax-classes-8d95f6d1-ff64-43c3-8ff7-cdc933e16fde/projects/school-catalog) 学校目录 让我们通过为纽约市教育局创建一个数字化学校目录来测试你对类的知识。教育局希望目录为城市中的每所学校提供快速参考资料。 我们需要为小学和高中创建类。由于这些类共享属性和方法,每个类将继承自一个父类School。我们的父类和三个子类具有以下属性、获取器、设置器和方法: School 属性:名称(字符串)、级别(三个字符串之一:'primary'、'middle'或'high')和学生人数(数字) 获取器:所有属性都有获取器 设置器:学生人数属性有设置器 方法:.quickFacts()和.pickSubstituteTeacher()(这是一个静态方法) Primary 包括School类的所有内容,以及一个额外的属性 属性:接送政策(字符串) Middle 不包括任何额外的属性或方法 High 包括School类的所有内容,以及一个额外的属性 属性:运动队(字符串数组) 如果你正在寻找挑战,创建上述四个类的构造函数()和获取器。然后,使用步骤五、六和七中的设置器和方法规范来完成项目。