<script>
? ? ? ? // 定義一個學(xué)生管理對象
? ? ? ? let studentManager = {
? ? ? ? ? ? // 定義一個學(xué)生信息數(shù)組,該數(shù)組里面保存的是所有的學(xué)生信息
? ? ? ? ? ? stus: [{
? ? ? ? ? ? ? ? no: 1001,
? ? ? ? ? ? ? ? name: '周杰倫',
? ? ? ? ? ? ? ? age: 20,
? ? ? ? ? ? ? ? gender: '男'
? ? ? ? ? ? }, {
? ? ? ? ? ? ? ? no: 1002,
? ? ? ? ? ? ? ? name: '張學(xué)友',
? ? ? ? ? ? ? ? age: 26,
? ? ? ? ? ? ? ? gender: '男'
? ? ? ? ? ? }, {
? ? ? ? ? ? ? ? no: 1003,
? ? ? ? ? ? ? ? name: '蔡依林',
? ? ? ? ? ? ? ? age: 22,
? ? ? ? ? ? ? ? gender: '女'
? ? ? ? ? ? }],
? ? ? ? ? ? // 添加學(xué)生
? ? ? ? ? ? add(){
? ? ? ? ? ? ? ? // 先定義一個對象
? ? ? ? ? ? ? ? let obj = {}
? ? ? ? ? ? ? ? // 再給對象添加屬性
? ? ? ? ? ? ? ? obj.no = Number.parseInt(prompt('請輸入需要添加的學(xué)生學(xué)號:'))
? ? ? ? ? ? ? ? // 判斷學(xué)號是否重復(fù)
? ? ? ? ? ? ? ? let index = this.stus.findIndex(s => s.no === obj.no)
? ? ? ? ? ? ? ? while(index !== -1){
? ? ? ? ? ? ? ? ? ? obj.no = Number.parseInt(prompt('學(xué)號重復(fù)!請重新輸入需要添加的學(xué)生學(xué)號:'))
? ? ? ? ? ? ? ? ? ? index = this.stus.findIndex(s => s.no === obj.no)
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? obj.name = prompt('請輸入姓名:')
? ? ? ? ? ? ? ? obj.age = Number.parseInt(prompt('請輸入年齡:'))
? ? ? ? ? ? ? ? obj.gender = prompt('請輸入性別:')
? ? ? ? ? ? ? ? // 然后將該對象添加到數(shù)組中
? ? ? ? ? ? ? ? this.stus.push(obj)
? ? ? ? ? ? ? ? alert('添加成功!')
? ? ? ? ? ? },
? ? ? ? ? ? // 顯示學(xué)生信息
? ? ? ? ? ? show(){
? ? ? ? ? ? ? ? console.log('************************學(xué)生信息************************');
? ? ? ? ? ? ? ? console.log(`學(xué)號\t姓名\t年齡\t性別`);
? ? ? ? ? ? ? ? this.stus.forEach(s => {
? ? ? ? ? ? ? ? ? ? console.log(`${s.no}\t${s.name}\t${s.age}\t ? ?${s.gender}`);
? ? ? ? ? ? ? ? })
? ? ? ? ? ? },
? ? ? ? ? ? // 修改學(xué)生
? ? ? ? ? ? modify(){
? ? ? ? ? ? ? ? let no1 = Number.parseInt(prompt('請輸入需要修改的學(xué)生的學(xué)號:'))
? ? ? ? ? ? ? ? let stu = this.stus.findIndex(s => s.no === no1)
? ? ? ? ? ? ? ? // console.log(stu);
? ? ? ? ? ? ? ? while(stu === -1){
? ? ? ? ? ? ? ? ? ? // console.log(stu);
? ? ? ? ? ? ? ? ? ? no1 = Number.parseInt(prompt('學(xué)號不存在!請重新輸入需要修改的學(xué)生的學(xué)號:'))
? ? ? ? ? ? ? ? ? ? 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('請輸入需要修改的學(xué)生的學(xué)號:'))
? ? ? ? ? ? ? ? ? ? let stu = this.stus.find(s => s.no === no1)
? ? ? ? ? ? ? ? ? ? while(!stu){
? ? ? ? ? ? ? ? ? ? ? ? no1 = Number.parseInt(prompt('學(xué)號不存在!請輸入需要修改的學(xué)生的學(xué)號:'))
? ? ? ? ? ? ? ? ? ? ? ? stu = this.stus.find(s => s.no === no1)
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? stu.name = prompt('請輸入需要修改的姓名:')
? ? ? ? ? ? ? ? ? ? stu.age = parseInt(prompt('請輸入需要修改的年齡:'))
? ? ? ? ? ? ? ? ? ? stu.gender = prompt('請輸入需要修改的性別:')
? ? ? ? ? ? ? ? ? ? console.log('修改成功!');
? ? ? ? ? ? ? ? */
? ? ? ? ? ? },
? ? ? ? ? ? // 刪除學(xué)生
? ? ? ? ? ? delete(){
? ? ? ? ? ? ? ? let no2 = Number.parseInt(prompt('請輸入需要刪除的學(xué)生的學(xué)號:'))
? ? ? ? ? ? ? ? let isR = this.stus.findIndex(s => s.no === no2)
? ? ? ? ? ? ? ? if(isR === -1){
? ? ? ? ? ? ? ? ? ? no2 = Number.parseInt(prompt('學(xué)號不存在!請重新輸入需要刪除的學(xué)生的學(xué)號:'))
? ? ? ? ? ? ? ? ? ? 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(`************************歡迎使用學(xué)生管理系統(tǒng)************************
? ? 1.添加學(xué)生 ?2.查詢學(xué)生 ?3.修改學(xué)生 ?4.刪除學(xué)生 ?0.退出系統(tǒng)`))
? ? ? ? ? ? ? ? switch (num) {
? ? ? ? ? ? ? ? ? ? case 1:
? ? ? ? ? ? ? ? ? ? ? ? // 調(diào)用添加學(xué)生的方法
? ? ? ? ? ? ? ? ? ? ? ? this.add()
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? case 2:
? ? ? ? ? ? ? ? ? ? ? ? // 調(diào)用顯示學(xué)生的方法
? ? ? ? ? ? ? ? ? ? ? ? this.show()
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? case 3:
? ? ? ? ? ? ? ? ? ? ? ? // 調(diào)用修改學(xué)生的方法
? ? ? ? ? ? ? ? ? ? ? ? this.modify()
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? case 4:
? ? ? ? ? ? ? ? ? ? ? ? // 調(diào)用刪除學(xué)生的方法
? ? ? ? ? ? ? ? ? ? ? ? this.delete()
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? default:
? ? ? ? ? ? ? ? ? ? ? ? alert('您已經(jīng)成功退出系統(tǒng),歡迎下次使用!')
? ? ? ? ? ? ? ? ? ? ? ? // break; ?// 跳出循環(huán),表示跳出整個循環(huán)
? ? ? ? ? ? ? ? ? ? ? ? return ?// 跳出整個方法:返回空,強行跳出整個方法
? ? ? ? ? ? ? ? ? ? ? ? // 遞歸方法必須要在方法體中添加一個return語句,以達到退出方法的效果
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? // 本處的遞歸調(diào)用思路:
? ? ? ? ? ? ? ? // 注意:菜單方法需要循環(huán)使用,所以該處采用了遞歸調(diào)用
? ? ? ? ? ? ? ? // 遞歸,就是函數(shù)在其方法體中調(diào)用自身,但得給一個出口,即結(jié)束循環(huán)的條件
? ? ? ? ? ? ? ? // menu()
? ? ? ? ? ? ? ? // 這種直接使用 函數(shù)名() 的遞歸調(diào)用方式,在函數(shù)名被修改時會發(fā)生錯誤
? ? ? ? ? ? ? ? // this.menu()
? ? ? ? ? ? ? ? // this.sysMenu()
? ? ? ? ? ? ? ? // 所以,當外部的方法名被修改后,內(nèi)部的方法名必須同時修改至一致
? ? ? ? ? ? ? ? // 但在實際開發(fā)中,會很容易忽略
? ? ? ? ? ? ? ? // 保險起見,遞歸調(diào)用時使用arguments對象去調(diào)用callee()方法:arguments.callee()
? ? ? ? ? ? ? ? // 注意:只要是方法,就一定會有一個參數(shù):arguments
? ? ? ? ? ? ? ? // 重新調(diào)用該方法
? ? ? ? ? ? ? ? // arguments.callee()
? ? ? ? ? ? ? ? // 但是重新調(diào)用該方法時,該函數(shù)的指向會出現(xiàn)問題,將會報錯
? ? ? ? ? ? ? ? // this.add is not a function
? ? ? ? ? ? ? ? // 此時的menu()方法中的this會指向window對象
? ? ? ? ? ? ? ? // 注意:由于是arguments調(diào)用的callee()方法,所以callee方法中的this就指向arguments對象
? ? ? ? ? ? ? ? // 但是arguments僅保存menu()方法中的屬性,其屬性中并沒有add()、show()等方法
? ? ? ? ? ? ? ? // 所以,在重復(fù)調(diào)用menu()方法后,再次調(diào)用add()、show()等方法時將會報錯:無法找到該方法
? ? ? ? ? ? ? ? // arguments.callee表示指向當前方法本身
? ? ? ? ? ? ? ? // console.log(arguments.callee); ?// 返回的是menu(){...}
? ? ? ? ? ? ? ? // 所以,在調(diào)用arguments.callee的同時,還需調(diào)用call方法改變callee()方法中this的指向
? ? ? ? ? ? ? ? // .call(this),這里的this指向的是school對象
? ? ? ? ? ? ? ? // 含義:第二次調(diào)用菜單方法時,該方法里里面的this,還是指向school對象
? ? ? ? ? ? ? ? arguments.callee.call(this)
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? // 調(diào)用school對象的menu方法
? ? ? ? studentManager.menu()
? ? </script>