- 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”来查看项目演示视频。