// 定义一个学生管理对象
let studentManager = {
// 定义一个学生信息数组,该数组里面保存的是所有的学生信息
stus: [{
no: 1001,
name: '周杰伦',
age: 20,
gender: '男'
}, {
no: 1002,
name: '张学友',
age: 26,
gender: '男'
}, {
no: 1003,
name: '蔡依林',
age: 22,
gender: '女'
}],
// 添加学生
add(){
// 先定义一个对象
let obj = {}
// 再给对象添加属性
obj.no = Number.parseInt(prompt('请输入需要添加的学生学号:'))
// 判断学号是否重复
let index = this.stus.findIndex(s => s.no === obj.no)
while(index !== -1){
obj.no = Number.parseInt(prompt('学号重复!请重新输入需要添加的学生学号:'))
index = this.stus.findIndex(s => s.no === obj.no)
}
obj.name = prompt('请输入姓名:')
obj.age = Number.parseInt(prompt('请输入年龄:'))
obj.gender = prompt('请输入性别:')
// 然后将该对象添加到数组中
this.stus.push(obj)
alert('添加成功!')
},
// 显示学生信息
show(){
console.log('************************学生信息************************');
console.log(`学号\t姓名\t年龄\t性别`);
this.stus.forEach(s => {
console.log(`${s.no}\t${s.name}\t${s.age}\t ${s.gender}`);
})
},
// 修改学生
modify(){
let no1 = Number.parseInt(prompt('请输入需要修改的学生的学号:'))
let stu = this.stus.findIndex(s => s.no === no1)
// console.log(stu);
while(stu === -1){
// console.log(stu);
no1 = Number.parseInt(prompt('学号不存在!请重新输入需要修改的学生的学号:'))
stu = this.stus.find(s => s.no === no1)
}
this.stus[stu].name = prompt('请输入需要修改的姓名:')
this.stus[stu].age = parseInt(prompt('请输入需要修改的年龄:'))
this.stus[stu].gender = prompt('请输入需要修改的性别:')
console.log('修改成功!');
/*
let no1 = Number.parseInt(prompt('请输入需要修改的学生的学号:'))
let stu = this.stus.find(s => s.no === no1)
while(!stu){
no1 = Number.parseInt(prompt('学号不存在!请输入需要修改的学生的学号:'))
stu = this.stus.find(s => s.no === no1)
}
stu.name = prompt('请输入需要修改的姓名:')
stu.age = parseInt(prompt('请输入需要修改的年龄:'))
stu.gender = prompt('请输入需要修改的性别:')
console.log('修改成功!');
*/
},
// 删除学生
delete(){
let no2 = Number.parseInt(prompt('请输入需要删除的学生的学号:'))
let isR = this.stus.findIndex(s => s.no === no2)
if(isR === -1){
no2 = Number.parseInt(prompt('学号不存在!请重新输入需要删除的学生的学号:'))
isR = this.stus.findIndex(s => s.no === no2)
}
this.stus.splice(isR, 1)
console.log('删除成功!');
},
// 菜单方法
menu(){
// sysMenu(){
// console.log(this);
let num = Number.parseInt(prompt(`************************欢迎使用学生管理系统************************
1.添加学生 2.查询学生 3.修改学生 4.删除学生 0.退出系统`))
switch (num) {
case 1:
// 调用添加学生的方法
this.add()
break;
case 2:
// 调用显示学生的方法
this.show()
break;
case 3:
// 调用修改学生的方法
this.modify()
break;
case 4:
// 调用删除学生的方法
this.delete()
break;
default:
alert('您已经成功退出系统,欢迎下次使用!')
// break; // 跳出循环,表示跳出整个循环
return // 跳出整个方法:返回空,强行跳出整个方法
// 递归方法必须要在方法体中添加一个return语句,以达到退出方法的效果
}
// 本处的递归调用思路:
// 注意:菜单方法需要循环使用,所以该处采用了递归调用
// 递归,就是函数在其方法体中调用自身,但得给一个出口,即结束循环的条件
// menu()
// 这种直接使用 函数名() 的递归调用方式,在函数名被修改时会发生错误
// this.menu()
// this.sysMenu()
// 所以,当外部的方法名被修改后,内部的方法名必须同时修改至一致
// 但在实际开发中,会很容易忽略
// 保险起见,递归调用时使用arguments对象去调用callee()方法:arguments.callee()
// 注意:只要是方法,就一定会有一个参数:arguments
// 重新调用该方法
// arguments.callee()
// 但是重新调用该方法时,该函数的指向会出现问题,将会报错
// this.add is not a function
// 此时的menu()方法中的this会指向window对象
// 注意:由于是arguments调用的callee()方法,所以callee方法中的this就指向arguments对象
// 但是arguments仅保存menu()方法中的属性,其属性中并没有add()、show()等方法
// 所以,在重复调用menu()方法后,再次调用add()、show()等方法时将会报错:无法找到该方法
// arguments.callee表示指向当前方法本身
// console.log(arguments.callee); // 返回的是menu(){...}
// 所以,在调用arguments.callee的同时,还需调用call方法改变callee()方法中this的指向
// .call(this),这里的this指向的是school对象
// 含义:第二次调用菜单方法时,该方法里里面的this,还是指向school对象
arguments.callee.call(this)
}
}
// 调用school对象的menu方法
studentManager.menu()