美文网首页
构造函数

构造函数

作者: 败于化纤 | 来源:发表于2023-02-07 20:45 被阅读0次

    ⽇考题

    ⼀、什么是构造函数(10分)

    • 用于构造多个对象的特殊函数
    • 构造函数是函数构造器
    • 构造函数:用于构造对象的模板
    • 构造函数名首字母大写,便于区分普通函数
    • 构造函数使用new关键词调用

    ⼆、简述构造函数的⼯作原理(20分)

    • 使用new调用构造函数时执行了以下操作
      1.创建一个对象分配给变量this
      2.然后将传入的实参分配给对象的属性
      3.默认返回this

    三、使⽤new调⽤构造函数创建实例对象的问题是什么(10分)

    • 使用同一个构造函数创建多个实例对象时,每个实例对象的方法都是私有的,同一个方法多个对象私有,消费内存
    • 通过构造器函数向对象添加⽅法的缺点是:当创建多个对象实例时, 对象属性被添加到每⼀个实例对象中,也就是说内存使⽤效率降低:每个实例的属性⽅法会在内存堆中创建存储空间。
    • 可以使⽤ prototype 属性解决这个问题,把⽅法添加到构造函数的 prototype 对象身上,让所有的对象实例共享⽅法。

    四、我想为实例对象(构造函数:Car())添加⼀个 start(){console.log('启动')} ⽅法,请写出语句(10分)

    Car.prototype.start = function(){console.log('启动')}
    

    五、请阐述你对”对象的原型式图“的理解(50分)

    • 任何构造函数内部都有 prototype 属性:该属性指向⼀个被称为 原型 的对象
    • 任何 原型 对象内部都有⼀个 constructor 属性: 该属性指向构造函数 User()
    • 通过关键词 new 调⽤构造函数User创建了实例对象 user1
    • 在创建实例对象的过程中,构造函数⾃动为实例对象分配了⼀个⽗级对象,这个⽗级对象就是实例对象的 原型 对象。
    • 任何实例对象上都有⼀个 proto 属性,该属性指向其 原型 对象。

    1.什么是构造函数

    • ⼀个⽤于构建多个对象的特殊函数。
    • 构造函数:constructor(构造器) function(函数)
      构造函数是一个构造器
    • 构造函数是一个用于构造对象类型的函数
    • 构造函数一个用于构造对象的模板
    • 构造对象 === 创建对象
    • JavaScript中,用new关键字来调用的函数,称为构造函数,构造函数首字母一般大写

    2.创建一个User构造函数

    创建一个构造函数需要两步

    • 在函数体内使用this定义属性
    • 使用new调用构造函数

    从技术上讲,构造函数是具有以下约定的常规函数:

    • 构造函数名建议⾸字⺟⼤写,以区分普通函数。
    • 构造器函数应该使⽤new操作符调⽤。
      请注意,ES6 引⼊了 class 关键字,允许您定义⾃定义类型。类只是构造函数的语法糖,具有⼀些增强功能。

    创建一个User对象的模板函数

            function User(){
                this.nema = "长舟";
                this.Nickname = "十恶不赦";
                this.age = "10";
                this.gender = "女";
                this.sing = function(){console.log("晚夜微雨问海棠")};
            }
    

    使用new调用构造函数

      const User1 = new User();
            const User2 = new User();
            console.log(User1) ;
            console.log(User2) ;
    

    传参

     function User(nema,Nickname,age,gender,sing){
                this.nema = nema;
                this.Nickname = Nickname;
                this.age = age;
                this.gender = gender;
                this.sing = function(){console.log("晚夜微雨问海棠")};
            }
    

    传入实参

    const User1 = new User("白器","华中",18,"女");
            const User2 = new User("份","华中",300,"男");
            console.log(User1);
            console.log(User2);
    

    3.构造函数工作原理

    基本上,使⽤new调⽤构造函数时执⾏了以下操作:
    • 创建⼀个空对象并将其分配给变量this 。
    • 将参数和分配给对象的属性。
    • 返回 this

    从技术上,构造函数在内部做隐式做了如下工作

     function User(nema,Nickname,age,gender,sing){
    //this 默认指向window
    //this = {} 1.隐式:偷偷修改了this指向一个空对象
                this.nema = nema; //2.显式:为空对象添加属性和方法
                this.Nickname = Nickname;
                this.age = age;
                this.gender = gender;
                this.sing = function(){console.log("晚夜微雨问海棠")};
            }
    //return this 3. 隐式:设置return this
    

    为什么使用构造函数会创建一个对象呢?

    过程复杂且不利于维护。使⽤构造器函数可以解决这个问题

    构造函数里面的return

    • 通常,构造函数隐式返回this,这个this指向新构建的对象。
    • 如果手动返回return
      return this;则同隐式返回this
      return后跟⾮对象值,则返回this(⾮对象值被忽略);
      return后跟对象值,则对象值覆盖this;
     function User(nema, Nickname, age, gender, sing) {
                //this 默认指向window
                //this = {} 1.隐式:偷偷修改了this指向一个空对象
                this.nema = nema; //2.显式:为空对象添加属性和方法
                this.Nickname = Nickname;
                this.age = age;
                this.gender = gender;
                this.sing = function () { console.log("晚夜微雨问海棠") };
                 //return this 3. 隐式:设置return this
                // return "123"//如果返回非对象,那么正常返回this
                return {x:1}//如果返回对象,那么返回的对象将覆盖掉this
            }
                const uu =new User("bzd","ai")
                console.log(uu)
    

    构造函数的问题

    问题:通过构造器函数向对象添加⽅法的缺点是:当创建多个对象实例时, this.属性或方法被添加到每⼀个实例对象中,也就是说内存使⽤效率降低:每个实例的 属性或⽅法会在内存堆中创建存储空间。
    解决:使用prototype:把⽅法添加到构造函数的 prototype 对象身上,让所有的对象实例共享该⽅法或者属性。

    把⽅法添加到构造函数的原型对象上

    示例

    let student3 = new Student('⼩丽',16)
    student3.sayHi() //⼩丽:'Hi~'
    function User(name, age) {
    this.name = name;
    this.age = age
    // this.sing = function () {console.log('lalala')} //错误⽅法:不要把函数添加到构造函数内
    部,原因:消耗内存
    }
    User.prototype.sing = function () {console.log('lalala')}//正确⽅法:要把⽅法添加到构造函数的
    原型对象上。
    console.log(User);
    const user1 = new User('张三', 19)
    const user2 = new User('张三', 19)
    console.log(user1.sing === user2.sing);//true 说明user1.sing和user2.sing指向同⼀个函数
    // console.log(User.prototype);
    // console.log(user1.toString());//[object Object]
    console.log(user1.__proto__);
    

    原型示意图

    3262e8231b0cfd5957e4dfe42d46e54.png

    阐述

    • 任何构造函数内部都有 prototype 属性:该属性指向⼀个被称为 原型 的对象
    • 任何 原型 对象内部都有⼀个 constructor 属性: 该属性指向构造函数 User()
    • 通过关键词 new 调⽤构造函数User创建了实例对象 user1
    • 在创建实例对象的过程中,构造函数⾃动为实例对象分配了⼀个⽗级对象,这个⽗级对象就是实例对象的 原型 对象。
    • 任何实例对象上都有⼀个 proto 属性,该属性指向其 原型 对象。

    构造函数的prototype属性是什么

    • 当使⽤new关键词调⽤构造函数创建对象实例时,构造函数会⾃动为实例对象分配⼀个⽗级对象,这个⽗级对象就是实例对象的原型。
    • 并且实例对象会拥有这个它的原型的所有属性和⽅法。
    • 每⼀个构造函数都有⼀个prototype属性,这个属性就是实例对象的原型对象。
      • 所有的构造函数都有一个prototype属性
      • prototype 属性指向⼀个对象,这个叫”原型对象“。
      • 构造函数使用它指向的“原型对象”创建实例
      • “原型对象”:也是一个对象,意味着原型对象也有自身的属性和方法
      • “原型对象”有一个 constructor 属性

    constructor

    • 所有的“原型对象”身上都有一个constructor属性
    • constructor属性指向一个构造函数

    --proto-- 属性

    • 所有的实例对象身上都有一个非标准的--proto--属性
    • --proto--属性指向它的原型对象

    null

    • null表示到达了原型链的顶端。

    相关文章

      网友评论

          本文标题:构造函数

          本文链接:https://www.haomeiwen.com/subject/tswxkdtx.html