javascript基础十五:说说new操作符具体都干了什么?

news2024/11/20 2:06:00

在这里插入图片描述
一、是什么
在JavaScript中,new操作符用于创建一个给定构造函数的实例对象

举个粟子

function Parent (name,age){
    this.name = name;
    this.age = age;
}
undefined
Parent.prototype.sayName = function(){
    console.log(this.name)
}
ƒ (){
    console.log(this.name)
}
const child = new Parent('小爱同学',25)
undefined
child
Parent {name: '小爱同学', age: 25}
child.sayName
ƒ (){
    console.log(this.name)
}

在这里插入图片描述
从上面可以看到:

  • new 通过构造函数Parent 创建出来的实例可以访问到构造函数中的属性
  • new 通过构造函数 Parent 创建出来的实例可以访问到构造函数原型链中的属性(即实例与构造函数通过原型链连接了起来)
    现在在构建函数中显式加上返回值,并且这个返回值是一个原始类型
// 返回一个对象
function Test(name){
    this.name = name
    return {}
}
undefined
const t = new Test('小爱同学')
undefined
t.name
undefined
从上面可以发现,构造函数如果返回值为一个对象,那么这个返回值会被正常使用
// 返回基本类型
function Test(name){
    this.name = name
    return 1
}
undefined
const t1 = new Test('小爱同学')
undefined
t1.name
'小爱同学'

可以发现,构造函数中返回一个原始值,然而这个返回值并没有作用这个在this的应用中有讲过

二、流程

从上面介绍中,我们可以看到new关键字主要做了以下的工作:

  • 创建一个新的对象obj
  • 将对象与构建函数通过原型链连接起来
  • 将构建函数中的this绑定到新建的对象obj上
  • 根据构建函数返回类型作判断,如果是原始值则被忽略,如果是返回对象,需要正常处理

举个粟子:

function Person(name, age){
    this.name = name;
    this.age = age;
}
const person1 = new Person('Tom', 20)
console.log(person1)  // Person {name: "Tom", age: 20}
t.sayName() // 'Tom'

流程图如下:
在这里插入图片描述
三、手写new操作符
现在我们已经清楚地掌握了new的执行过程

那么我们就动手来实现一下new

function myNew(fn,...args){
    const obj = {}
    obj.__proto__ = fn.prototype
    let result = fn.apply(obj,args)
    return result instanceof Object?result:obj
}

测试一下

function myNew(fn,...args){
    const obj = {}
    obj.__proto__ = fn.prototype
    let result = fn.apply(obj,args)
    return result instanceof Object?result:obj
}
undefined
function Parent(name,age){
    this.name = name
    this.age = age
}
undefined
const child = myNew(Parent,'小爱同学',25)
undefined
child
Parent {name: '小爱同学', age: 25}
Parent.prototype.sayName = function(){
    console.log(this.name)
}
ƒ (){
    console.log(this.name)
}
const child = myNew(Parent,'小爱同学',25)
undefined
child
Parent {name: '小爱同学', age: 25}
child.sayName()
 小爱同学

在这里插入图片描述
可以发现,代码虽然很短,但是能够模拟实现new

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

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

相关文章

佛朗斯冲击港交所IPO:叉车租赁的未来是数字化?

佛朗斯“三战”IPO。 图源:佛朗斯 近日,广州佛朗斯股份有限公司(下文简称为“佛朗斯”)正式向港交所递交招股书,拟于港交所主板挂牌上市。 值得注意的是,这并不是佛朗斯首次冲击IPO。2019年6月和2020年7月…

操作系统-计算机系统概述-特性发展分类分层结构

目录 一、定义 1.1特征 二、操作系统的分类和发展 2.1手工操作阶段 2.2批处理阶段 2.2.1单道批处理系统 2.2.2多道批处理系统 2.3分时操作系统 2.4实时操作系统 2.5 网络操作系统 2.6分布式操作系统 2.7 个人计算机操作系统 三、操作系统的运行与机制 内核态和用…

【Python】函数 ⑤ ( 函数说明文档 | 函数说明文档内容建议 | 代码示例 )

文章目录 一、函数说明文档1、函数说明文档简介2、函数说明文档内容建议2、代码示例 - 函数说明文档 一、函数说明文档 1、函数说明文档简介 函数说明文档 就是 通过 注释 对 函数的作用进行解释说明 ; 函数说明文档 用法 : 在 函数定义 后 , 函数体的第一行位置 , 输入六个双…

Linux:Linux基础网络设置

ifconfig ifconfig #查看网卡信息 inet---网络接口的ip地址 netmask---子网掩码 broadcast---广播地址 ether----物理地址(mac地址) hostname hostname #查看主机名 hostnamectl set-hostname 自定义主机名 route route # 查看网卡网关 destination-…

华为OD机试真题B卷 Java 实现【检查是否存在满足条件的数字组合】,附详细解题思路

一、题目描述 给定一个正整数数组,检查数组中是否存在满足规则的数字组合 规则:A B 2C 二、输入描述 第一行输出数组的元素个数。 接下来一行输出所有数组元素,用空格隔开。 三、输出描述 如果存在满足要求的数,在同一行…

Ubuntu使用ssh连接两个主机

前提:两者连接同一个WiFi(局域网) ssh安装: sudo apt-get install openssh-client sudo apt-get install openssh-server 首先在两个主机分别终端输入:ifconfig 查询两者的ip 用户名是前面的那个: …

【算法系列 | 1】深入解析排序算法之冒泡排序

序言 你只管努力,其他交给时间,时间会证明一切。 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记一级论点蓝色:用来标记二级论点 决定开一个算法专栏,希望能帮助大…

大湾区C++模拟题

大湾区信息学创新大赛模拟题 一、单项选择题(15题共30分) 1.计算机的运算速度取决于给定的时间内,它的处理器所能处理的数据量。处理器一次能处理的数据量叫字长。已知64位奔腾处理器一次能处理64个信息,相当于( A …

厨电「前浪」压「后浪」

作者 | 辰纹 来源 | 洞见新研社 俗话说,姜是老的辣。说的是老年人有经验,办事稳重老练。 俗话也说,长江后浪推前浪。说的是经过历练的新人新事胜过旧人旧事。 这两句话看似矛盾,实则充满哲理,老而弥坚的老手与初生牛…

网关如何让非Matter设备快速加Matter网络?

作为连接智能家居设备的重要桥梁,网关是所有命令请求的入口,并完美充当起“翻译官”的角色。它能够精准“翻译”拥有不同通信协议、数据传输格式及网络地址里所包含的信息,将数据重新打包,以适应目的系统的需求。 虽然网关对于智…

matlab学习笔记(十)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 matlab学习笔记(十) 一、实验目的二、实验原理和实验内容三、案例运行例1:电磁波传输问题的动态仿真,编写 MATLAB 程序实现线极…

Maven高级——分模块设计与开发

Maven的定义: 一个用来构建和管理java项目的工具。 分模块设计 一个大型项目通常需要有很多功能实现,这些功能分成多个模块,卸载一个项目里面最后只会导致这个项目越来越大。不便于维护,以及组件难以复用。 在项目设计的时候就可以将不同的…

九大亮点+六大好处,瑞云科技虚拟仿真实训平台引领教育信息化新潮流

随着新技术的快速发展和数字化转型的加速推进,高等教育面临着培养创新型、复合型、适应型人才的新要求。 虚拟仿真实训教学作为一种新型的教学模式,能够有效解决实训教学中的高投入、高损耗、高风险及难实施、难观摩、难再现的“三高三难”问题&#xf…

如何运行Python程序?

Python 是一种解释型的脚本编程语言,这样的编程语言一般支持两种代码运行方式: 1) 交互式编程 在命令行窗口中直接输入代码,按下回车键就可以运行代码,并立即看到输出结果;执行完一行代码,你还可以继续输…

手搓一个C++11的线程池(含测试)

实现 首先要有线程池这个结构体&#xff1a; 互斥锁条件变量消息队列关闭标志位 struct Pool {std::mutex mtx;std::condition_variable cond;std::queue<std::function<void()>> tasks;bool isClosed;//用来退出无限循环};【首先是线程池的对象】其实就是维护一…

【数据结构与算法】力扣:二叉树的前、中、后序遍历

递归法 前序遍历 给你二叉树的根节点 root &#xff0c;返回它节点值的前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; 输入&#xff1a;…

IPO后,北森驶向HR SaaS深水区

透过这次发布会&#xff0c;能感知到的依旧是北森马不停蹄的“加速度”&#xff0c;纪伟国口中不断重复的“以客户为中心”&#xff0c;以及不断开放兼容的生态。 作者| 皮爷 出品|产业家 北森&#xff0c;还是那个北森。 在刚刚举办的“HR SaaS未来势”2023北森春季产品…

Vscode搭建开发调试STM32环境IDE

单片机开发IDE环境如KeilMDK&#xff0c;虽然操作简单&#xff0c;方便调试。但就是代码编辑风格很老套&#xff0c;中文符号乱码还是常有的事。而如今流行的vscode编辑器很不错&#xff0c;免费且相当轻量级&#xff0c;用来代码开发体验很不错&#xff0c;看着都舒服。Clion …

swagger在spring项目中的使用

一、Swagger2介绍 前后端分离开发模式中&#xff0c;api文档是最好的沟通方式。 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 及时性 (接口变更后&#xff0c;能够及时准确地通知相关前后端开发人员)规范性 (并且保…

电子科技大学计算机系统结构复习笔记(一):概述

目录 前言 重点一览 计算机分类 弗林分类法 市场分类 计算机系统结构定义 实现技术\功耗\成本的趋势\可靠性(了解) 计算机性能 性能评价指标 性能评价方法 计算机设计的量化原则 基本方法 Amdahl‘s 定律 CPU 性能公式 / 时间计算 本章小结 前言 本复习笔记基于…