- Objective: - Breadcrumb: # 概念阐释 # 实例 # 相关内容 # 问题 1. **1. 为什么isCheckOut需要set,标题和评级不需要?** 2. **2. 调用方法,print属性;调用方法,print方法;理解why** 3. **3. 设置方法和属性可以从实例往回推** 4. **4. 什么时候用参数?什么时候用空值? **未解决:** - [ ] 为每个类添加更多的属性(电影演员,歌曲标题等)。 - [x] 创建一个继承自Media的CD类。 - [x] 在.addRating()方法中,确保输入在1到5之间。 - [x] **为CD类创建一个名为shuffle的方法。该方法返回一个随机排序的包含所有歌曲的数组。** - [ ] 创建一个名为Catalog的类,用于保存我们图书馆中的所有Media项。 # 问题答案 1. 因为是isCheckOut改变原来的属性值,rating、title都仅改变**实例**中的值,并不改变**类**中的属性值。 2. 调用方法,print属性发生在需要先执行方法中的代码步骤,再把结果通过`set`储存回属性中,然后print属性结果。 4. 都可以,用数组空值的写一个`.push()`进去 ```js class Media { constructor(title) { this._title = title; this._isCheckedOut = true; this._ratings = [ ]; } get title() { return this._title; } get isCheckedOut() { return this._isCheckedOut; } get ratings() { return this._ratings; } //5. 创建一个isCheckedOut属性的setter。why??? 因为需要重新赋值。 set isCheckedOut(newIsChckedOut) { this._isCheckedOut = newIsChckedOut; } //6.在你的getter方法下面,创建一个名为toggleCheckOutStatus的方法,当书被借出时,展示不可以借,当书在图书馆时,显示可以借。 toggleCheckOutStatus(){ this._isCheckedOut = !this._isCheckedOut; } // 7. 在 .toggleCheckOutStatus() 下面,创建一个名为 getAverageRating 的方法。返回 ratings 数组的平均值。 getAverageRating() { var sum = this._ratings.reduce(function(a, b) { return a + b; }, 0); var average = sum / this._ratings.length; return average; } addRating(newRating) { if (newRating >= 1 && newRating <= 5) { this._ratings.push(newRating); } else { return console.log('请评级,1-5分'); } } } // 子类 class Book extends Media { constructor(title,author,pages){ super(title); this._author = author; this._pages = pages; } get author() { return this._author; } get pages() { return this._pages; } } class Movie extends Media { constructor(title,director,runtime){ super(title); this._director = director; this._runtime = runtime; } get director() { return this._director; } get runtime() { return this._runtime; } } //创建实例 const historyOfEverything = new Book('A Short History of Nearly Everything','Bill Bryson',544); console.log(historyOfEverything); //16.17.当书被借出时,展示不可以借,当书在图书馆时,显示可以借。先调用方法,再给出属性结果 historyOfEverything.toggleCheckOutStatus(); console.log(`是否可借:${historyOfEverything.isCheckedOut}`); //18. 调用3次加入评级,push到属性中 historyOfEverything.addRating(4); historyOfEverything.addRating(5); historyOfEverything.addRating(5); console.log(historyOfEverything.ratings); //19. 计算加入评级的平均分 console.log(historyOfEverything.getAverageRating() ); // 20. 创建电影实例 const speed = new Movie('Speed','Jan de Bont',116); console.log(speed); // 21. check这部电影是否在图书馆,先调用方法,再给出属性结果 speed.toggleCheckOutStatus(); console.log(speed.isCheckedOut); // 23. 添加评级 speed.addRating(1); speed.addRating(1); speed.addRating(5); console.log(speed.ratings); // 24. 计算平均值 console.log(speed.getAverageRating()); /*25.好样的!如果你已经做到了这一步,那么显然你对类语法和继承有很强的理解。 如果你想继续在这个项目上工作,我们列出了一些可以在你现有的进展上进行扩展的途径。 给每个类添加更多的属性(电影演员,歌曲标题等)。 创建一个继承自Media的CD类。 在.addRating()方法中,确保输入在1到5之间。 为CD类创建一个名为shuffle的方法。该方法返回一个随机排序的包含所有歌曲的数组。 创建一个名为Catalog的类,用于保存我们图书馆中的所有Media项。*/ class Cd extends Media { constructor(title,artist,songs){ super(title); this._artist = artist; this._songs = songs; } get artist() { return this._artist; } get songs() { return this._songs; } //Fisher-Yates洗牌算法 shuffle() { let shuffledSongs = [...this._songs]; // creating a copy of original songs array for(let i = shuffledSongs.length - 1; i > 0; i--){ const j = Math.floor(Math.random() * (i + 1)); const temp = shuffledSongs[i]; shuffledSongs[i] = shuffledSongs[j]; shuffledSongs[j] = temp; } return shuffledSongs; } } // 创建cd实例 const jay = new Cd('jay','周杰伦',['1','2','3','4','5']); console.log(jay); //评级push到rating属性中,所以print的是rating属性 jay.addRating(5); console.log(jay.ratings); // 随机展示歌曲没有改变属性,也没有push会songs属性,所以print shuffle方法 console.log(jay.shuffle()); ``` # 参考资料 - [Build a Library](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/build-a-library) 建立一个图书馆 恭喜你成为了当地Books-‘N-Stuff图书馆的馆长,他们急需你的帮助。他们仍在使用索引卡来组织他们的内容!哎呀。 但没关系,你懂一些JavaScript,让我们开始现代化你的新家。 Books-‘N-Stuff有三种**不同类型**的媒体:书籍、CD和电影。在这个项目中,你将创建一个名为**Media的父类**,它有三个**子类:Book、Movie和CD**。这三个子类具有以下**属性和方法**: Book 属性:作者(字符串)、==标题(字符串)==、页数(数字)、==isCheckedOut==(布尔型,初始值为false)和==评级==(数组,初始值为空)。 Getter:所有属性都有getter法:.getAverageRating()、.toggleCheckOutStatus()和.addRating() Movie 属性:导演(字符串)、==标题(字符串)==、运行时间(数字)、==isCheckedOut==(布尔型,初始值为false)和==评级==(数组,初始值为空) Getter:所有属性都有getter 方法:.getAverageRating()、.toggleCheckOutStatus()和.addRating() CD 属性:艺术家(字符串)、==标题(字符串)==、==isCheckedOut==(布尔型,初始值为false)和==评级==(数组,初始值为空)、歌曲(字符串数组) Getter:所有属性都有getter 方法:.getAverageRating()、.toggleCheckOutStatus()和.addRating() 如果你想挑战自己,可以尝试在不使用下面的步骤的情况下创建这四个类。 如果你在这个项目中遇到困难,或者想看看经验丰富的开发者如何完成它,点击“Get Unstuck”来查看项目演示视频。