三种方式创建对象的几种方式及new实例化时做了什么?

news2024/12/24 3:33:52

创建对象的几种方式

  1. 利用对象字面量创建对象
const obj = {}

2.利用 new Object创建对象

 const obj = new Object()

3.使用 构造函数实例化对象

function Fn(name) {
    this.name = name
  }
const obj = new Fn('张三')
console.log(obj.name); //张三

为什么要用构造函数的形式?

有同学可能会问:我们用对象字面量创建对象不是很方面快捷吗,为啥会出现构造函数这种繁琐的创建方式呢?
因为第1,2种方式只比较适用于我们需要创建少量对象时,而如果我们要创建很多个对象,且每个对象的属性有很多属性相同时,我们再用对象字面量去创建对象的话,就会显得代码很冗余了。如:
在这里插入图片描述
而我们使用构造函数创建的话,只需这样:

function Fn(name, age, gender) {
    this.name = name
    this.age = age
    this.gender = gender
  }
  const peiqi = new Fn('佩奇', 6, '女')
  const qiaozi = new Fn('乔治', 3, '男')
  const mon = new Fn('猪妈妈', 26, '女')
  const dad = new Fn('猪爸爸', 28, '男')

实例化对象时的new到底做了什么呢?

  1. 创建一个空对象
  2. 设置原型链: 把空对象的__proto__属性指向构造函数的prototype对象
  3. 执行构造函数:并进入构造函数Fn中执行操作,把this指向新创建的对象
  4. 返回对象(如果构造器没有手动返回对象,则返回第一步的对象)
function Fn(name, age, gender) {
    this.name = name
    this.age = age
    this.gender = gender
  }
 // 模拟new实例化过程
 function myNew(constructorFn, ...args) {
    const obj = {}
    obj.__proto__ = constructorFn.prototype
    const result = constructorFn.apply(obj, args)
    return typeof result === 'object' ? result : obj
  }
  const cat = new myNew(Fn, '机器猫', 28, '男')

为什么要执行第二点,即设置原理链

是为了共享构造函数原型中的属性和方法: obj.proto = constructorFn.prototype
在这里插入图片描述

function Fn(name, age, gender) {
    this.name = name
    this.age = age
    this.gender = gender
  }
  Fn.prototype.say = function () {
    console.log('sayHi');
  }
  function myNew(constructorFn, ...args) {
    const obj = {}
    //这样实例化出来的对象就可以使用原型对象中的属性和方法啦
    obj.__proto__ = constructorFn.prototype
    const result = constructorFn.apply(obj, args)
    return typeof result === 'object' ? result : obj
  }
  const cat = new myNew(Fn, '机器猫', 28, '男')

原型链总结

  • 每个构造函数都有一个prototype属性,该属性指向原型对象,原型对象用来给各个实例化对象共享属性和方法。
  • 每个实例化对象都有一个__proto__属性,该属性也指向原型对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/832017.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于STM32F103C8T6的温湿度控制系统(从PCB制作到成品展示)

很久就想写一篇入门级的硬件项目流程介绍,最近终于有了机会,接下来会从PCB设计到成品展示,一步一步地记录,如果对你有帮助,那便是最好。大白话记录我的整个开发流程,有点无聊,各位看官多多担待。…

POLARDB -- Ausitndatabases 历年的文章集合

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…

模糊照片怎么修复清晰?教你轻松修复照片清晰度

照片记录着我们生活中的美好瞬间,然而,由于拍摄时手抖或对焦不准等原因,我们常常会遇到模糊的照片。你们通常都会怎么处理这些照片呢?是直接删掉吗?其实我们可以不用删掉,只需要使用一些图修复工具来修复这…

操作系统启动后网络还需要比较慢的时间才启动(差不多二分钟)

环境 linux 4.14.61 systemd version 247.3 问题 启动时发现网络其实很快就起来了,但是mqtt和docker启动的很慢,导致相关依赖启动很慢。 问题分析 实际通过systemctl list-units发现systemd-networkd-wait-online启动失败 而且从字面上看也有延时…

VB6中FSO具体应用详解

文前申明:原文为通用版实例代码,本菜鸟在每例之后加入一个简单的实例(均验证通过),供有需要的朋友参考. 您正在看的VB教程是:VB入门基础认识VB的文件系统对象FSO。 在 VB 编程中经常需要和文件系统打交道,比如获取硬盘的剩余空间、判断文件夹或文件是否存在等。在…

【JDK 11】【JDK 8】项目 jdk 版本升级,修改方案与实践

前言 工作中,难免会遇到升级版本的事情。这次由于两个系统中,系统 A 是用的 JDK8 版本,系统 B 是用 JDK11 版本;要求同步 JDK 版本,也就是升级到11版本。那么接下来将进行介绍~ 问题与解决 1. .sh 脚本启动无法启动…

状态模式——对象状态及其转换

1、简介 1.1、概述 在软件系统中,有些对象也像水一样具有多种状态,这些状态在某些情况下能够相互转换,而且对象在不同的状态下也将具有不同的行为。为了更好地对这些具有多种状态的对象进行设计,可以使用一种被称为状态模式的设…

SAS-数据集SQL水平合并

一、SQL水平合并基本语法 sql的合并有两步,step1:进行笛卡尔乘积运算,第一个表的每一行合并第二个表的每一行,即表a有3行,表b有3行,则合并后3*39行。笛卡尔过程包含源数据的所有列,相同列名会合…

JavaScript的单元挑战

Steven想要建立一个非常简单的小费计算器,以便他去餐厅吃饭时使用。在他的国家,如果账单金额在50到300之间,通常会给15%的小费。如果金额不同,小费就是20%。 您的任务是根据账单金额计算小费。为此创建一个名为’tip’的变量。不允…

2023天猫休闲零食市场分析(天猫数据分析软件)

基于较大的人口基数以及人们对休闲零食的需求,我国的休闲零食市场始终保持着稳健的增长趋势,行业整体的规模也比较大。根据鲸参谋电商数据分析平台的相关数据显示,2023年1月份至4月份,天猫平台上休闲零食行业的销量为6亿&#xff…

对模版以及模版中参数的理解

所谓模板,实际上是建立一个通用函数或类,其类内部的类型和函数的形参类型不具体指定,用一个虚拟的类型来代表。 就比方说你想要实现 一个Add的加法函数,面对不同的类型,你是否要进行多次函数重载呢,其实这多…

网络安全(黑客)自学的误区

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员(以编程为基础的学习)再开始学习 我在之前的回答中,我都一再强调不要以编程为基础再开始学习网络安全,一般来说,学习编程不但学习周期长,而…

许战海咨询方法论系列白皮书在京隆重发布

新时代,面对剧烈变化的竞争环境,企业如何实现结构性增长? 7月31日,许战海咨询最新研究成果——《主品牌进化战略》、《第二招牌增长战略》、《链主品牌:制造业的竞争之王》三本核心方法论白皮书,重磅发布。…

移动端网页div下滑消失、上滑出现(附带闪烁效果)

<div :class "IconShow ? mhomeIcon : IconOff"><img src"/assets/news.svg" alt""></div>// 距离顶部的距离const top ref(0) // 图标向上还是向下滑动const IconShow ref(true)// 滑动监听&#xff0c; 注意如果只有doc…

【C++】深入浅出STL之vector类

文章篇幅较长&#xff0c;越3万余字&#xff0c;建议电脑端访问 文章目录 一、前言二、vector的介绍及使用1、vector的介绍2、常用接口细述1&#xff09;vector类对象的默认成员函数① 构造函数② 拷贝构造③ 赋值重载 2&#xff09;vector类对象的访问及遍历操作① operator[]…

zookeeper入门学习

zookeeper入门学习 zookeeper应用场景 分布式协调组件 客户端第一次请求发给服务器2&#xff0c;将flag值修改为false&#xff0c;第二次请求被负载均衡到服务器1&#xff0c;访问到的flag也会是false 一旦有节点发生改变&#xff0c;就会通知所有监听方改变自己的值&#…

c++画出分割图像,水平线和垂直线

1、pca 找到图像某个区域的垂直线&#xff0c;并画出来 // 1、 斑块的框 血管二值化图&#xff0c;pca 找到垂直血管壁的直线, 还是根据斑块找主轴方向吧// Step 1: 提取斑块左右范围内的血管像素点坐标&#xff0c;std::vector<cv::Point> points;for (int y 0; y <…

Stable Diffusion教程(6) - 扩展安装

打开stable diffusion webUI界面 加载插件列表 依次点击扩展->可用->加载自 搜索插件 首先在搜索框输入你要安装的插件&#xff0c;然后点击插件后面的安装按钮 如果你需要的插件这里面没有找到&#xff0c;可通过通网址安装的方式安装。 在git仓库网址输入框输入的你插件…

警惕!中科院预警,Frontiers这本不被收录!2023年7月EI目录已更新!(附全年下载)

2023年7月EI期刊目录更新 爱思唯尔官网近日更新了EI期刊目录&#xff0c;此次更新是2023年7月1日&#xff0c;与上次更新&#xff08;2023年6月&#xff09;相比&#xff0c;有1本期刊名称在Serials&#xff08;连续出版&#xff09;列表中搜索不到&#xff0c;详情如下&#…

InfiniBand、UCIe相关思考

InfiniBand、UCIe相关思考 内容1、InfiniBandInfiniBand是什么&#xff1f;InfiniBand的来历是什么&#xff1f;InfiniBand为什么重要&#xff1f;InfiniBand相较于Ethernet区别&#xff1f;同领域内还有其他哪些技术&#xff1f;InfiniBand中RDMA是种什么技术&#xff1f; 内容…