对象数组练习:学生管理系统

<script>

        // 定义一个学生管理对象

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

    </script>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容