自定义构造函数的书写和缺陷

自定义构造函数的书写

1.一定是和 new 关键字连用,如果没有和 new 关键字连用,那么它就是一个普通函数

2.当一个函数和 new 关键字连用的时候, 这个函数就被称为自定义构造函数, 这个函数内的 this 指向, 指向返回出来对象

3.构造函数不能使用给箭头函数, 因为箭头函数内部没有 this

4.构造函数内部不需要 return

return 了基本数据类型, 写了和没写一样

return 了引用数据类型, 写了构造函数就没用了

5.书写构造函数时, 首字母建议大写.目的: 仅仅是为了和普通函数区分开

6.我们构造函数 通过 new 关键字 创建出来的对象, 叫做实例化对象, 本质上还是一个对象, 只不过名字上叫做实例化对象(实例对象)

我们把构造函数通过 new 关键字 创建对象的过程叫做 实例化

<script>

   function createObj(num1, num2) {
            // 此时 this === 将来被返回出去的对象
            this.a = num1
            this.b = num2

            // return '我是 一个 普通字符串'
            // return [1, 2, 3, 4, 5]
        }
        const o1 = new createObj(1, 2)
        const o2 = new createObj(10, 20)
        console.log(o1)
        console.log(o2)

        function Person() {
            this.name = 'QF001'
        }
        const p1 = new Person()

</script>

<script>
   const p1 = new Person()

   new Person()        //此时这个过程叫做 实例化, Person函数因为和new关键字连用, 我们叫做 
   自定义构造函数

   //此时 常量 p1    我们叫做 实例化对象(实例对象)
</script>

构造函数的缺陷

1、构造函数最明显的缺点就是,每个方法都要在每个实例上重新创建一遍。

2、不是原型链继承,只是借用构造函数,所以不能继承原型的属性和方法。

3、虽然构造函数中定义的属性和方法是可以访问的,但是每个实例都被复制了。

<script>
        // function Person (name, age) {
        //     this.name = name
        //     this.age = age
        //     this.fn = function () {
        //         console.log('AAAAAA')
        //     }
            /**
             *  这样写 实际功能也能完成, 但是多次创建对象时
             *  会多次创建 功能代码完全相同一个函数
             *  这对内存空间是一种浪费
            */
        }

        function fn() {
            console.log('AAAAAA')
        }
        function Person(name, age) {
            this.name = name
            this.age = age
            this.fn = fn
            /**
             *  这样写 实际功能也能完成, 并且在多次创建的时候
             * 
             *  每次给 this.fn 赋值时, 都会去找到 fn 函数
             * 
             *  然后多个对象的 this.fn 的引用地址 都是一个
            */
        }

        /**
         *  通过 new 关键字 实例化 一个对象, 叫做 p1
         * 
         *  函数内部执行时:
         *      1. 将参数 name 赋值给 this.name
         *      2. 将参数 age 赋值给 this.age
         *      3. 创建一个函数(XF001)  赋值给 this.fn
        */
        const p1 = new Person('QF001', 18)


        /**
         * 通过 new 关键字 实例化一个对象, 叫做 p2
         *  
         *  函数内部执行时:
         *      1. 将参数 name 赋值给 this.name
         *      2. 将参数 age 赋值给  this.age
         *      3. 创建一个函数(XF002) 赋值给 this.fn
        */
        const p2 = new Person('QF002', 19)
        console.log(p1)
        console.log(p2)

        p1.fn()
        p2.fn()

        console.log(p1.fn == p2.fn)
 
</script>

猜你喜欢

转载自blog.csdn.net/weixin_48649246/article/details/127910825