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

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容