對象數(shù)組練習:學(xué)生管理系統(tǒng)

<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>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容