当前位置: 首页 > news >正文

32、构造函数

1、用构造函数反复创建多个相同结果的对象

问题

如果想反复创建多个相同结构但是内容不同的对象时{}创建会代码重复,及其不便于维护!

解决

今后只要想反复创建同一类型的多个相同结构不同内容的对象时都用构造函数来创建

专门描述同一类型所有对象的同一结构的函数

如何: 2

i. 先定义构造函数

function  类型名(形参, ...){

 this.新属性名=形参; 

   ... = ... ;

   this.新方法名=function(){
   ... this.属性名 ...

          }

}

ii. 调用构造函数创建新对象

 var 新对象名=new 类型名();

优点

代码重用,便于维护!

2、new构造函数时都做了什么?


1.创建一个空对象
var obj = {};

2.链接到原型,将obj的proto指向构造函数的prototype
obj._proto = 类名._prototype;

4.绑定this值,让function函数的this指向obj,并执行函数体
类名.call(obj);

5.返回这个对象

3、构造函数的问题

如果将方法的定义放在构造函数内每调用一次构造函数创建一个新对象都会反复创建相同的方法的副本!——浪费内存

今后,所有多个子对象共用的属性值或方法定义都要添加到原型对象中: 强行赋值

构造函数.prototype.新成员=新值。

<script>
    //定义构造函数描述所有学生对象的同一结构
    function Student(sname, sage){
      this.sname=sname;
      this.sage=sage;
      //构造函数中不要包含方法定义!
    }
    //输出Student类型的原型对象
    console.log(Student.prototype);

    //向Student的原型对象中强行添加新共有方法
    Student.prototype.intr=function(){
      console.log(`I'm ${this.sname}, I'm ${this.sage}`)
    }
    console.log(Student.prototype);

    //反复调用构造函数创建lilei和hmm
    var lilei=new Student("Li Lei",11);
    var hmm=new Student("Han Meimei",12);

    //亲子鉴定   
    console.log(
    //李磊的 爹     是不是Student的老公
      lilei.__proto__==Student.prototype
    );//true

    console.log(
      //李磊的爹    是不是hmm的爹
      lilei.__proto__==hmm.__proto__
    );//true

    console.log(lilei);

    console.log(hmm);

    lilei.intr();

    hmm.intr();
</script>

注:根据 ES6 规范,箭头函数不能用作构造函数,使用new调用会抛出错误。其次,箭头函数是否有prototype属性?没有,普通函数才有prototype属性,箭头函数没有,所以person.prototypeundefined,无法添加方法。

4、自有属性和共有属性

a. 自有属性: 保存在当前对象自身内部的属性,只归当前对象自己所有的属性。今后,凡是构造函数中this.后的属性,都会成为自对象的自有属性

b. 共有属性: 保存在原型对象/父对象中的,归多个子对象共有的属性

c. 获取属性值: 无论自有属性,还是共有属性,都可用: 子对象.属性名

d. 修改属性值

1). 修改自有属性的值: 子对象.属性名=属性值

2). 修改共有属性的值: 

   i. 错误: 子对象.共有属性=属性值

   如果强行给子对象不存在的属性赋值不会去原型对象中查找属性。而是自动给当前子对象自己添加一个新属性。

    如果新属性与原型对象中的属性同名按就近原则只要访问子对象.属性名时,永远只能使用自己自有的属性。不在去原型对象中查找。

   ii. 正确: 只要想修改原型对象中共有的属性都必须用原型对象来修改: 构造函数.prototype.共有属性=属性值

5、原型链

a. 什么是: 由多级父对象/原型对象逐级继承,形成的链式结构

b. 保存着: 一个对象可用的所有属性和方法!

c. 控制着: 对象属性和方法的使用顺序: 就近原则

 1). 优先在当前对象内部查找自有属性

   2). 当前对象内部没有想要的属性,才自动延_ _proto_ _去父对象中查找!

 

相关文章:

  • CentOS 系统安装 docker 以及常用插件
  • 介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用。
  • mapbox基础,使用线类型geojson加载symbol符号图层,用于标注文字
  • 零信任架构实战手册-企业安全升级
  • 【AD】6-1 PCB常用规则
  • 7年全栈开发经验 · 兼职技术合作
  • 基于SpringBoot的Mybatis和纯MyBatis项目搭建的区别
  • 【协议篇】RPC、gRPC
  • React封装axios请求方法
  • 在Vue3中集成XGPlayer视频播放器的完整指南
  • 鸿蒙 Next 实现线程之间的通信
  • export HADOOP_CLASSPATH=`hadoop classpath`
  • 将大模型输出答案清洗数学公式格式为markdown文件
  • 《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(49)万鸦壶焚网络 - 网络延迟时间(Bellman-Ford)
  • 使用 Doris 和 LakeSoul
  • 蓝桥备赛(19)- 哈希表和 unordered_ set 与unordered_map(上)
  • 程序化广告行业(13/89):DSP的深入解析与运营要点
  • C++自学方法论:从零基础到工程实践的体系化路径研究
  • Leetcode:34(二分查找)
  • CNN 稠密任务经典结构
  • 全国35城居民对公共服务满意度“打分”,上海多项指标居首
  • 抖音开展“AI起号”专项治理,整治利用AI生成低俗猎奇视频等
  • 全总联合六部门印发工作指引,共保劳动者合法权益
  • 内蒙古赤峰市城建集团董事长孙广通拟任旗县区党委书记
  • 九江银行落地首单畜牧业转型金融业务,助推传统农业绿色智能
  • 世界数字教育大会发布“数字教育研究全球十大热点”