面向对象

83 阅读3分钟

创建对象的方式 (需要能够方便我们批量创建对象)

    1. 字面量的方式 这个方式不合适, 不利于批量创建
    1. 内置构造函数 这个方式不合适, 不利于批量创建
    1. 工厂函数的方式 其实就是 创建一个函数, 但是函数内部可以创建一个对象, 我们把这种函数叫做工厂函数
//1. 字面量的方式
        let obj = {
            name: 'QF001',
            age: 18
        }

        //2. 内置构造函数
        let obj = new Object()

        // 3. 工厂函数
        function createObj(num) {
            // 3.1 手动创建一个对象
            const obj = {}

            // 3.2 手动给对象上添加一些属性
            obj.name = 'QF001'  // 添加一个 固定的字符串, 每次创建对象他的属性都是 ''QF001
            obj.age = num       // 利用形参给对象的属性赋值一个 '变量', 这样每次创建对象时都可以修改这个属性的值

            // 3.3 手动给对象返回
            return obj
        }

        let obj1 = createObj(18)
        let obj2 = createObj(66)
        console.log(obj1)
        console.log(obj2)

自定义构造函数的方式

什么是构造函数?

  • 本质上就是一个普通函数, 如果再调用的时候, 前边加上一个关键字 new,那么我们把这种函数叫做 构造函数。
  • 构造函数的书写:
    1. 构造函数的函数名首字母 大写 (建议, 非强制), 目的就是为了和普通函数做一个区分
    1. 构造函数内 不要写 return, 如果 return 的是一个 基本数据类型, 写了也没用, 如果 return 的是一个 引用数据类型, 写了就会导致构造函数没用。
    1. 构造函数调用时, 必须和 new 关键字连用、如果不连用, 也能调用, 但是构造函数就没用了。
    1. 构造函数内部的 this 当一个函数 和 new 关键字连用的时候, 那么我们说这个函数是 构造函数,然后这个函数内部的 this 指向本次调用被自动创建出来的那个对象
    1. 构造函数不能使用 箭头函数,因为箭头函数内部没有 this
// 构造函数的书写
        function Person(name, age) {
            // 因为 构造函数自动创建出来的对象可以通过 this 来访问, 所以我们需要向这个对象上添加属性的时候, 可以通过 this 来添加
            this.name = name
            this.age = age
            this.a = '我是随便添加的一个属性 a, 我是固定的内容'

            // return '我是一个 没有意义的字符串'
            // return {
            //     t: '当你看到我的时候, 说明构造函数失效了'
            // }
        }

        const p1 = new Person('QF666', 18)
        console.log(p1)

构造函数的缺点

构造函数内部 如果有这个引用数据类型, 比如函数在多次调用构造函数时, 每一次都会重新创建一个函数, 必然会造成这个内存空间的浪费。

// 原版构造函数 (有小问题)
        function Person(name, age) {
            this.name = name
            this.age = age
            this.a = '我是随便添加的一个属性 a, 我是固定的内容'
            this.fn = function () {
                console.log('我是 fn 函数')
            }
        }

        // 更新版 构造函数
        function winFn() {
            console.log('我是 fn 函数')
        }
        function Person(name, age) {
            this.name = name
            this.age = age
            this.a = '我是随便添加的一个属性 a, 我是固定的内容'
            this.fn = winFn
        }

        const p1 = new Person('QF666', 18)
        p1.fn()

        const p2 = new Person('QF001', 99)
        const p3 = new Person('QF001', 99)