美文网首页
构造函数

构造函数

作者: 败于化纤 | 来源:发表于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表示到达了原型链的顶端。

相关文章

  • Flutter 6种构造函数详解

    Flutter有生成构造函数、默认构造函数、命名构造函数、重定向构造函数、常量构造函数、工厂构造函数 一.生成构造...

  • C# 构造函数总结

    构造函数 构造函数分为:实例构造函数,静态构造函数,私有构造函数。 实例构造函数 1、构造函数的名字与类名相同。 ...

  • Javascript 基础之原型链

    构造函数、构造函数实例、构造函数原型 function Student (name) { } - 这是构造函数va...

  • Swift基础语法-类的构造函数

    本节知识点 构造函数的介绍 构造函数的基本使用 自定义构造函数 属性与构造函数 1. 构造函数的介绍 构造函数类似...

  • C++:面向对象基础

    构造函数 C++中有三种构造函数:默认构造函数,有参构造函数,拷贝构造函数 类对象的初始化 括号法//默认构造函数...

  • 构造函数

    构造函数分为: 1.实例构造函数 2.私有构造函数 3.静态构造函数 私有构造函数 私有构造函数是一种特殊的实例构...

  • Dart整理

    Dart构造函数 普通构造函数和命名构造函数 默认构造函数一个类没有声明构造函数,默认会有一个无参构造函数,声明了...

  • Kotlin面向对象 (3)✔️构造函数

    主构造函数次构造函数默认构造函数 kotlin中的构造函数有主次之分,主构造函数只能有一个,此构造函数可以有多个。...

  • [C++之旅] 10 构造函数

    [C++之旅] 10 构造函数 构造函数的特点 构造函数在对象实例化时被自动调用 构造函数与类同名 构造函数没有返...

  • Java基础-3 构造函数

    构造函数: 构造函数的作用: 给对应的对象进行初始化。 构造函数的格式: 构造函数要注意的细节:1. 构造函数是...

网友评论

      本文标题:构造函数

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