JavaScript面向对象简单实例——图书馆

功能描述

模拟图书馆

  1. 存书
    ① 将书籍存储到图书馆仓库
    ② 需要进行新旧程度验证
  2. 借出书
    ① 从图书馆仓库移除这本书
    ② 并把这本书给读者
  3. 查询书
    ① 查询所有
    ② 根据id查询

模拟老师

  1. 借入书
    ① 从图书馆借入书籍
    ② 放到自己的书库
  2. 读书
    ① 阅读指定书籍
    ② 会让书籍变旧 程度-3
  3. 还书
    ① 将书籍从自己的书库中移除
    ② 还给图书馆

模拟学生

  1. 借入书
    ① 从图书馆借入书籍
    ② 放到自己的书库
  2. 读书
    ① 阅读指定书籍
    ② 会让书籍变旧 程度-6
  3. 还书
    ① 将书籍从自己的书库中移除
    ② 还给图书馆

分析

实现这个功能, 需要做以下考虑:

  1. 理清楚依赖关系, 分析, 应该先做什么, 后做什么
  2. 分离出对象, 找出对象的共性, 查看是否可抽取到父类型, 使用继承

实现步骤

  1. 设计好书籍和图书馆
    ① 书籍:书ID, 书名, 价格,新旧级别
    ② 图书馆:
    1. 名称, 存书的仓库
    2. 行为
    ① 存储书籍:检测新旧程度
    ② 移除书籍
    ③ 查询书籍:查询所有、根据ID查询

  2. 设计学生和老师
    ① 人
    1. 姓名, 年龄, 读书消耗的新旧值
    2. 行为:借书、看书、还书
    ② 学生
    1. 学号
    2. 固定的折旧值 4
    ③ 老师
    1. 钱
    2. 固定的折旧值 2

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>02-面向对象-综合练习-1</title>
</head>
<body>
<script>
    /**
     * 构造函数 书籍类
     * @param {string}bookID 书籍的ID(唯一)
     * @param {string}bookName 书籍的名称
     * @param {number}bookPrice 书籍的价格
     * @param {number}oldLevel 书籍的新旧程度(0-10)(旧-新)
     * @constructor
     */
    function Book(bookID, bookName, bookPrice, oldLevel) {
        this.bookID = bookID;
        this.bookName = bookName;
        this.bookPrice = bookPrice;
        this.oldLevel = oldLevel;
    }

    // 原型对象
    Book.prototype.desc = function () {
        return 'ID:' + this.bookID + ', 书名: ' + this.bookName + ', 价格:' + this.bookPrice + ',新旧程度: ' + this.oldLevel;
    }
</script>
<script>

    /**
     * 图书馆的构造函数
     * @param {string}libName
     * @constructor
     */
    function Library(libName) {
        // 1. 私有变量 仓库
        var store = [];

        // 2. 私有函数 检测书籍的新旧程度
        function isOldBook(bookObj) {
            if (bookObj.oldLevel <= 0) {
                bookObj.oldLevel = 0;
                return true;
            }
            return false;
        }
        this.libName = libName;
        /**
         * 存储图书
         * @param {object}bookObj
         */
        this.saveBook = function (bookObj) {
            if (!isOldBook(bookObj)) { // 正常的书籍
                store.push(bookObj);
                console.log('成功存入:' + bookObj.desc());
            } else {
                console.log('书籍报废, 不能存入:' + bookObj.desc());
            }
        };
        /**
         *  借出图书
         * @param {string}bookID
         * @returns {*}
         */
        this.borrowBook = function (bookID) {
            // 1. 遍历所有图书
            for (var i = 0; i < store.length; i++) {
                // 2. 取出图书
                var bookObj = store[i];
                // 3. ID对比
                if (bookObj.bookID === bookID) { // 找到
                    break; // 跳出循环
                }
            }

            // 4. 判断
            if (i === store.length) {
                console.log('查无此书');
                return;
            }

            // 5. 把图书从仓库移除
            var borrowBook = store.splice(i, 1)[0];

            // 6. 返回出借的图书
            console.log('成功出借: \n' + borrowBook.desc());
            return borrowBook;
        };
        /**
         * 查询所有的图书
         * @returns {Array}
         */
        this.queryAllBook = function () {
            var result = '图书馆内共有以下图书: \n';
            for (var i = 0; i < store.length; i++) {
                var bookObj = store[i];
                result += bookObj.desc() + '\n';
            }
            console.log(result);
            return store;
        };
        /**
         * 根据书ID查询图书
         * @param bookID
         * @returns {*}
         */
        this.queryBookWithID = function (bookID) {
            // 1. 遍历所有的图书
            for (var i = 0; i < store.length; i++) {
                // 2. 取出图书
                var bookObj = store[i];
                // 3. ID对比
                if (bookObj.bookID === bookID) { // 找到
                    break; // 跳出循环
                }
            }
            // 4. 判断
            if (i === store.length) {
                console.log('查不到ID为:' + bookID + '的书籍');
                return;
            }
            // 5. 返回书籍
            console.log('查到ID为:' + bookID + '的书籍: \n' + bookObj.desc());
            return bookObj;
        }
    }
</script>
<script>
    /**
     * 人类的构造函数
     * @param {string}name 姓名
     * @param {number}age 年龄
     * @param {number}oldStep 损耗速度
     * @constructor
     */
    function Person(name, age, oldStep) {
        this.name = name;
        this.age = age;
        this.oldStep = oldStep;

        this.store = []; // 个人的书库
    }

    Person.prototype = {
        constructor: Person,
        // 借入图书
        borrowBook: function (bookObj) {
            console.log(this.name + '成功借入:' + bookObj.bookName + '一本');
            this.store.push(bookObj);
        },
        // 看书
        readBook: function (bookID) {
            // 1. 查询图书
            for (var i = 0; i < this.store.length; i++) {
                // 2. 取出图书
                var bookObj = this.store[i];
                // 3. ID对比
                if (bookObj.bookID === bookID) { // 找到
                    break; // 跳出循环
                }
            }
            // 4. 判断
            if (i === this.store.length) {
                console.log('查不到ID为:' + bookID + '的书籍');
                return;
            }
            // 5. 读书
            console.log(this.name + '成功阅读' + bookObj.bookName + '一本');
            bookObj.oldLevel -= this.oldStep; // 阅读了, 书籍就旧了
        },
        // 还书
        backBook: function (bookID) {
            // 1. 查询图书
            for (var i = 0; i < this.store.length; i++) {
                // 2. 取出图书
                var bookObj = this.store[i];
                // 3. ID对比
                if (bookObj.bookID === bookID) { // 找到
                    break; // 跳出循环
                }
            }
            // 4. 判断
            if (i === this.store.length) {
                console.log('您的书库中没有编号(' + bookID + ')这本书');
                return;
            }

            // 5. 找到
            this.store.splice(i, 1);
            console.log('准备还书:\n' + bookObj.desc());
            return bookObj;
        }
    };
</script>
<script>
    /**
     * 老师类
     * @param {string}name
     * @param {number}age
     * @param {number}money
     * @constructor
     */
    function Teacher(name, age, money) {
        // 1. 借助构造函数继承
        Person.call(this, name, age, 2);
        this.money = money;
    }

    // 2. 寄生式组合继承
    function Obj() {}
    Obj.prototype = Person.prototype;
    var t1 = new Obj();
    Teacher.prototype = t1;
    t1.constructor = Teacher;


    /**
     * 学生类
     * @param {string}name
     * @param {number}age
     * @param {string}no
     * @constructor
     */
    function Student(name, age, no) {
        // 1. 借助构造函数继承
        Person.call(this, name, age, 4);
        this.no = no;
    }

    // 2. 寄生式组合继承
    function Temp() {}
    Temp.prototype = Person.prototype;
    var temp = new Temp();
    Student.prototype = temp;
    temp.constructor = Student;
</script>
<script>
    // 1. 创建4本书
    var book1 = new Book('TS001', 'JS基础', 30, 9);
    var book2 = new Book('TS002', 'JS进阶', 40, 6);
    var book3 = new Book('TS003', 'JS面向对象', 60, 8);
    var book4 = new Book('TS004', '颈椎病康复秘技', 1230, 10);

    // 2.存入图书馆
    var library = new Library('建华图书馆');
    library.saveBook(book1);
    library.saveBook(book2);
    library.saveBook(book3);
    library.saveBook(book4);

    // 3. 借书
    var stu = new Student('张三', 18, '0908210001');
    // 3.1 图书馆借出
    var bBook = library.borrowBook('TS001');
    // 3.2 学生借入
    stu.borrowBook(bBook);

    // 4. 学生读书
    stu.readBook('TS001');

    // 5. 学生还书
    // 5.1 从自己的书库中取出书籍
    var gBook = stu.backBook('TS001');
    // 5.2 放入图书馆仓库
    library.saveBook(gBook);

    library.queryAllBook();
    console.log(stu.store);
</script>
<script type="text/html">
    /* var book = new Book('TS001', 'JS面向对象', 30.88, 10);
    console.log(book.desc());*/

    // 1. 创建4本书
    var book1 = new Book('TS001', 'JS基础', 30, 9);
    var book2 = new Book('TS002', 'JS进阶', 40, 6);
    var book3 = new Book('TS003', 'JS面向对象', 60, 8);
    var book4 = new Book('TS004', '颈椎病康复秘技', 1230, 10);

    // 2.存入图书馆
    var library = new Library('建华图书馆');
    library.saveBook(book1);
    library.saveBook(book2);
    library.saveBook(book3);
    library.saveBook(book4);

    // 3. 借出书籍
    library.borrowBook('TS004');

    // 4. 查询还剩多少图书
    library.queryAllBook();

    // 5. 根据ID查询
    library.queryBookWithID('TS001');
</script>
</body>
</html>

运行结果:
在这里插入图片描述

发布了270 篇原创文章 · 获赞 123 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/KaiSarH/article/details/104429283
今日推荐