「JavaScript深入」聊一聊 new操作符具体干了什么?

JavaScript深入 — new操作符

    • 概念
    • 流程
    • 手写new操作符


在这里插入图片描述

概念

在JavaScript中,new 操作符用于创建一个给定构造函数的实例对象

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

👆 可知:

  • new 通过构造函数 Person 创建出来的实例可以访问到构造函数中的属性
  • new 通过构造函数 Person 创建出来的实例可以访问到构造函数原型链中的属性(即实例与构造函数通过原型链连接了起来)

👇 构造函数中返回一个原始值,然而这个返回值并没有作用

function Test(name) {this.name = namereturn 1
}
const t = new Test('xxx')
console.log(t.name) // 'xxx'

👇 构造函数如果返回值为一个对象,那么这个返回值会被正常使用

function Test(name) {this.name = nameconsole.log(this) // Test { name: 'xxx' }return { age: 26 }
}
const t = new Test('xxx')
console.log(t) // { age: 26 }
console.log(t.name) // 'undefined'

流程

new 关键字的流程如下:

  • 创建一个新的对象 obj

    //创建一个新的空对象
    {}
    
  • 将对象与构造函数通过原型链连接起来

    //将新对象的[[prototype]]指向为Person.prototype
    {__proto__ = Person.prototype;
    }
    
  • 将构造函数中的this绑定到新建的对象 obj

    //将Person构造函数的this设置为新创建的对象,执行
    {__proto__ = Person.prototype;name = 'Tom';age = 20;
    }
    
  • 根据构造函数的返回类型作判断,如果是原始值则被忽略,如果返回对象,需要正常处理

    //构造函数Person没有return对象的话,将该新创建的对象返回
    const person = {...}
    

👻 具体流程图如下:

在这里插入图片描述


手写new操作符

function myNew(Func, ...args) {//创建一个新对象const obj = {};//新对象原型指向构造函数原型对象Object.setPrototypeOf(obj, Func.prototype);//将构建函数的this指向新对象const result = Func.apply(obj, args);//根据返回值判断return result !== undefined ? result : obj;
}

👇 测试代码

function Person(name, age) {this.name = name;this.age = age;
}
Person.prototype.say = function () {console.log(this.name);
};let p = myNew(Person, "huihui", 123);
console.log(p); // Person {name: "simon", age: 123}
p.say(); // simon

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

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

相关文章

WT2605C蓝牙语音芯片智能对话模型 人机互动 让机械设备更智能

随着人工智能技术的飞速发展,AI语音芯片在机械设备领域的应用日益广泛。WT2605C作为一款集成了在线TTS(Text-To-Speech,文本到语音)功能的蓝牙语音芯片,凭借其卓越的性能和广泛的应用前景,为机械设备产品带…

C++简单缓冲区类设计

目录 1.引言 2.静态缓冲区 3.动态缓冲区 4.数据引用类 5.自动数据引用类 6.几种缓冲区的类关系图 7.注意事项 8.完整代码 1.引言 在C中,设计静态和动态缓冲区类时,需要考虑的主要差异在于内存管理的方式。静态缓冲区类通常使用固定大小的内存区域…

JAVA使用Scanner类的nextLint()方法无法正确读取中文。

在练习的时候,我发现我使用Scanner类的nextLint()方法无法正确读取到中文了。检查了我的idea编辑器,用的编码格式也是”utf-8“。所以编码格式没有问题。 问题如下棉两张图所示,我输入宝马后,控制台不打印…

外包干了2年,收获不少。。。

有一种打工人的羡慕,叫做“大厂”。 真是年少不知大厂香,错把青春插稻秧。 但是,在深圳有一群比大厂员工更庞大的群体,他们顶着大厂的“名”,做着大厂的工作,还可以享受大厂的伙食,却没有大厂…

STM32F407单片机编程入门(二十七)以太网接口详解及实战含源码

文章目录 一.概要二.单片机以太网系统基本结构1.OSI 七层模型2.单片机实现以太网功能组成 三.STM32F407VET6单片机以太网内部结构1.MII接口介绍2.RMII接口介绍 四.LWIP TCP/IP协议栈介绍五.PHY收发器LAN8720介绍1.LAN8720内部框图2.LAN8720应用电路3.LAN8720以太网模块 六.Cube…

测试的底层逻辑

写这篇文章,是希望把我的一些我认为是非常有价值的经验总结出来,能够帮助刚做测试不久的新同事,或者是测试经验丰富的老同事以共享。希望我们可爱的新同事,准备要在测试领域耕耘的伙伴,能够通过我的文章了解到测试的底…

【智慧城市】新中地GIS开发实训项目:华农优秀学生学习成果展示(3)智游江城

华农GIS开发实训项目答辩③-智游江城/一个月学习成果展示 项目名称:智游江城 项目功能 主页面展示 菜单功能 控制台 3D城市 查询 导航 游览路线推荐 测量 资讯

Node的安装和配置

1、安装Node 下载nodejs 链接:下载 | Node.js 中文网 官网下载最新版本:https://nodejs.org/en/download/ 一路点击Next,最后Finish。nodejs一般会下载在C盘里。 下载完成后,可以在cmd中查看安装的nodejs和npm版本,…

【C++】红黑树的封装——同时实现map和set

目录 红黑树的完善默认成员函数迭代器的增加 红黑树的封装红黑树模板参数的控制仿函数解决取K问题对Key的非法操作 insert的调整map的[]运算符重载 在list模拟实现一文中,介绍了如何使用同一份代码封装出list的普通迭代器和const迭代器。今天学习STL中两个关联式容器…

lime使用记录

主要是对预测结果进行可解释 import numpy as np import pandas as pd from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import classification_re…

thinkphp6调用微信商户支付-合单支付工具代码开发

合单支付基本在加盟店或是分公司或是营销系统里面常见。他的出现,打破了传统提现支付或是转账支付。他的业务原理其实很简单,就是需要优先申请非普通商户,其次是每个入驻的商户都需要申请普通商户。在这之前一定要申请好对应的场景服务&#…

大学学校用电安全远程监测预警系统

1.概述: 该系统是基于移动互联网、云计算技术,通过物联网传感终端,将办公建筑、学校、医院、工厂、体育场馆、宾馆、福利院等人员密集场所的电气安全数据,实时传输至安全用申管理服务器,为用户提供不间断的数据跟踪&a…

2024年项目经理不能错过的开源项目管理系统大盘点:全面指南

在2024年,随着项目管理领域的不断发展,开源项目管理系统成为了项目经理们提升工作效率的利器。本文将全面盘点几款备受推荐的开源项目管理系统,帮助项目经理们找到最佳选择,不容错过。 在项目管理日益复杂的今天,开源项…

鼎阳加油-IOC关键技术问题的解决记

鼎阳SDS6204示波器EPICS IOC的搭建-CSDN博客 这款示波器在labview下工作的很好,以前搭建逐束团3D系统时连续几个月不间断的工作连接从没断过线,并做过速率测试,单通道时10Hz的波形更新速率都可以达到: 鼎阳SDS6204示波器波形读取…

温州大麓青年音乐节即将开唱,37组音乐人国庆齐聚共谱华章

金秋十月,当丰收的季节与音乐的旋律相遇,温州将迎来一场前所未有的文化盛事。2024年10月1日至4日,温州大麓青年音乐节将在瓯海盛大举行。不仅是一场音乐的狂欢,更是一次多元文化的碰撞与融合。本届音乐节邀请了37组以上的知名音乐…

中级职称评审到底需要准备什么材料?

职称评审需要的材料非常非常多,其中涉及到各类表格,这些小资料,看起来简单,实则做起来复杂,不过这种资料只能当年通知出来之后进行整理,今天甘建二跟大家说一下职称评审中需要提前准备的一些重要材料&#…

酒店智能门锁SDK接口通用转换函数对接酒店收银-SAAS本地化-未来之窗行业应用跨平台架构

一、通用转换代码 public class CyberWin_LocakAPP{// public static byte[] bufCard new byte[128 1];public static string 未来之窗_美萍_getsign(byte[] bufCard){int i;string 酒店标识, s, s2;// 先读卡string 未来之窗 Encoding.ASCII.GetString(bufCard);// edt_Ca…

使用dayjs获取今天日期,星期几

<div>{{ curDate }} {{ getWeek() }}</div>import dayjs from dayjs;data(){return{curDate: dayjs(new Date()).format(YYYY年MM月DD日)} }, mounted() {this.getWeek(); }, methods: {// 获取今天星期几getWeek() {let datas dayjs().day();let week [日, 一, …

Linux 搭建与使用yolov5训练和检验自建模型的步骤

Linux 搭建与使用yolov5训练和检验自建模型的步骤 硬件设备 环境搭建(无cuda) 下载anaconda wget https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.sh bash Anaconda3-2024.06-1-Linux-x86_64.sh # 看完许可证后, yes, 后面选择安装路径, 可以按默认路…

打造高效合同管理平台,提升企业运营效率

在现代企业的日常运营中&#xff0c;合同管理扮演着至关重要的角色。无论是劳动协议、采购订单还是销售合同&#xff0c;各类合同都承载着企业的重要信息和业务节点。然而&#xff0c;面对日益复杂的商业环境和海量合同数据&#xff0c;如何有效管理和利用这些合同成为众多企业…