面试常问的构造函数的new关键字原理及原型对象

99 阅读2分钟

工厂函数

工厂函数 :用于创建对象的函数

 function createPerson(name,age,sex){
            //1.创建对象
            let p = {}
            //2.给对象赋值
            p.name = name
            p.age = age
            p.sex = sex
            //3. 返回对象
            return p
        }
        let p1 = createPerson('张三',20,'男')
        let p2 = createPerson('李四',22,'女')
        console.log(p1,p2)

构造函数(面试常问)

构造函数 : 使用new调用的一个函数

  • 构造函数作用与工厂函数一致,都是用来创建对象的。但是代码更加简洁。

  • 构造函数 new 工作原理

    (1) 创建一个空对象

    (2) this 指向这个空对象

    (3) 对象进行赋值

    (4) 返回这个对象

  • 构造函数首字母一般大写, 为了提醒调用者不要忘记new关键字

  • 构造函数是不用加return的,new关键字会帮我们做这件事 但如果在构造函数内部 手动return呢?

    return 值类型 : 无效,还是返回new创建的对象

    return 引用类型 : 有效,会覆盖new创建的对象

function Object(name, age, sex) {
            /*  1. 创建一个空对象 
                2. this 指向这个对象
                3. 给对象赋值
                4. 返回这个对象
            */
            this.name = name
            this.age = age
            this.sex = sex
            // return 666  返回无效
            // return [0, 2, 3]  有效,会覆盖new创建的对象
        }
​
        console.log(new Object('张三', 20, '男'))

原型对象(面试常问)

原型对象 : 创建函数的时候,系统会自动创建一个对应的对象。 称之为原型对象。

作用 : 解决 内存资源浪费 + 全局变量污染

原型对象相关的三个属性 : 描述 构造函数、原型对象、实例对象三者关系

1.prototype : 属于构造函数 , 指向原型对象

2.constructor : 属于原型对象 , 指向构造函数

3.__ proto__ : 属于示例对象 , 指向原型对象

注意: 这个属性不是web标准,很多浏览器不会显示的。 这个属性在开发中不能使用,只能用于学习研究

   //1.构造函数
        function Person(name, age) {
            this.name = name
            this.age = age
        }
​
        //2.原型对象
        Person.prototype.eat = function () {
            console.log('吃东西')
        }
​
        Person.prototype.learn = function () {
            console.log('学习')
        }
​
        console.log(Person.prototype.constructor) //Person
​
​
        //3.实例对象
        let p1 = new Person('张三', 20)
        p1.eat() // 直接调用,不需要__proto__ 属性
​
        /* 验证 构造函数、原型对象、实例对象三者关系 */
​
        console.log(p1.__proto__.constructor) //Person
        console.log(Person.prototype === p1.__proto__) // true

关系图:

image.png