使用js实现一个new方法

一文大白话讲清楚javascript中new的原理和实现 阅读详情
AI摘要

博客围绕JS实现new关键字展开,提到开发中常使用new关键字,提出使用时new具体做了什么的疑问,还可查阅MDN资料,同时给出了代码示例及new方法的效果。

js实现一个new

在开发过程中,我们经常会使用new关键字,那我们在使用new关键字的时候,new到底做了什么呢?我们可以查阅资料,在MDN中有这样一段话

new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。new 关键字会进行如下的操作:

 1. 创建一个空的javascript对象就比如(即{});
 2. 链接该对象(即设置该对象的构造函数)到另一个对象;
 3. 将步骤1新创建的对象作为this的上下文;
 4. 如果该函数有没有返回对象,没有则返回this;
 
知道了new的这些功能,我们就能根据这些步骤来实现一个new的功能了!

代码示例


function _new(constructer, ...arg) {
   // 创建一个空的对象
   let resultObj = {};
   // 链接该对象到原型,这样新对象就能访问到原型上面的方法
   resultObj.__proto__ = constructer.prototype;
   // 然后实现步骤3,将新创建的对象作为this的上下文
   let result = constructer.call(resultObj, ...arg);
   // 实现步骤4:如果该函数没有返回对象(即result不是一个对象),则返回this(即resultObj)
   return typeOf result === 'object' ? result : resultobj
   
   // 接下来就可以看看new的实现效果了
}

new方法的效果:

function Persion(name, age) {
     this.name = name;
     this.age = age;
}
let Persion1 = _new(Persion, 'lucy', '18');
let Persion2 = _new(Persion, 'chuan', '20');
console.log(Persion1.name); // 'lucy'
console.log(Persion1.name); // 'chuan'
console.log(Persion1 instanceof Persion); // true
console.log(Persion2 instanceof Persion); // true
Java 反射实例化对象的方法 在 Java 中,反射是一种强大的机制,它允许我们在运行时检查类、方法、字段等,并且可以在运行时动态创建对象。反射提供了一组 API,可以通过类的名称、方法名、字段名等来获取类的信息并操作它们。需要注意的是,反射虽然强大,但是它的使用也需要谨慎。因此,在能够使用其他方式解决问题的情况下,最好避免使用反射。方法返回的构造函数可能是私有的,因此我们需要使用。或者直接使用类名获取到我们要实例化的类的。要实例化一个对象,可以使用反射机制中的。方法通过构造函数对象来实例化对象。的对象,并打印了它的信息。 阅读详情

相关推荐

Spring : Spring定义Bean的两种方式:< bean >和@Bean

1.美图 2.概述 Spring中最重要的概念IOC和AOP,实际围绕的就是Bean的生成与使用。 什么叫做Bean呢?我们可以理解成对象,每一个你想交给Spring去托管的对象都可以称之为Bean。 3.xml配置 最简单也是最原始的一种方式,通过XML来定义一个bean 3.1 创建entity,命名为Student @Data @AllArgsConstructor @NoArgsCons...

九师兄 806

JS学习记录2

Global对象 eval json Math对象 Number对象 Object对象

十三月的博客 548

Ubuntu20.04下Intel RealSense D435i相机驱动配置全攻略(含ROS Noetic适配)

本文详细介绍了在Ubuntu20.04系统下配置Intel RealSense D435i相机驱动的完整流程,包括libRealsense SDK 2.0安装、ROS Noetic适配及常见问题解决方案。通过实战指南帮助开发者快速实现深度相机与ROS的集成,适用于机器人视觉和SLAM应用开发。

weixin_29281915的博客 512

Java反射机制——通过反射机制实例化对象(详解)

1、使用反射机制实例化对象比较灵活。 Java代码只需写一遍,在不改变Java源代码的基础之上,可以做到不同对象的实例化。 非常灵活(符合OCP开闭原则:对扩展开放,对修改关闭。) 如果只要静态代码块执行,使用Class.forName(”完整类名“)。 2、java.util包下提供了一个资源绑定器,用于获取属性配置文件中的内容。 使用该方式时,属性配置文件必须放在类路径下; 资源绑定器,只能绑定xxx.properties文件 。......

Best_Basic的博客 3705

KNX智能家居工程设计应用

KNX,是一个起源于欧洲的总线标准,主要应用于家居和楼宇中,对末端电气设备进行总线式的控制,比如照明、空调、地暖、电动窗帘和遮阳设备等等。根据2017年英国著名咨询公司BSRIA的数据报告显示,在中国的智能家居和灯光控制市场,KNX产品的市场份额为各类产品中排名第一,占据了42%的市场份额,远远领先于其他的标准协议。设备中一个继电器表示一路输出,某些功能可能需要用到多个输出,比如1个窗帘AC输出需要占用两路继电器输出,一个继电器用于控制正转,一个用于控制反转,而普通开关输出则需要占用一路继电器输出即可。

hhhh5555666的博客 934

在不同版本Python中安装PyQT5及PyQT5-Tools

在不同版本Python中安装PyQT5及PyQT5-Tools

zoomgu680的博客 2万+

js使用原型实现继承与new一个新对象的方法

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <...

weixin_30667301的博客 105

UFS Link Startup全流程解析:从硬件初始化到链路稳定的5个关键阶段

本文详细解析了UFS Link Startup的全流程,从硬件初始化到链路稳定的5个关键阶段,包括初始化阶段、数据通道发现、数据通道重新对齐、链路启动收尾和能力交换阶段。通过时序分析、代码实现和实际案例,帮助开发者掌握UFS协议链路启动的技术细节,确保设备与主机之间的可靠通信。

weixin_30687051的博客 430

javascript 7种继承-- new操作符的原理以及实现

new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。创建一个空的简单 JavaScript 对象(即 {}); 为步骤 1 新创建的对象添加属性 proto,将该属性链接至构造函数的原型对象; 将步骤 1 新创建的对象作为 this 的上下文; 如果该函数没有返回对象,则返回 this。new操作符的实现 手动写一个new操作符功能的函数new constructor[([arguments])]

Penk的博客 480

wireshark提取视频数据之RTP包中提取H264和H265

本文主要描述从wireshark包数据中提取出H264和H265裸流数据方法,裸流通过RTP封包方式发送,从抓包中直接提取视频流数据,进而进行流媒体问题定位

技术控的笔记 17万+

【UVM实战】第七章:UVM中的寄存器模型(1)寄存器模型简介

寄存器模型简介~

悟已往之不谏 知来者之可追 2071

js new原理

参考:https://www.cnblogs.com/yzhihao/p/9306511.html 1、new的作用 执行一个构造函数,返回一个实例对象; const Animals = function(){ this.name = 'animals' } const cat = new Animals() console.log(cat.name) //animals 上面代码通过 new 命令,让构造函数Animals生成一个实例对象,保存在变量cat

weixin_44330517的博客 1319

〔重庆理工大学〕大学物理实验--变温霍耳效应及其参数测定

每个老师要求不同,实验报告内容和数据仅供参考。

Pretty Boy Fox的博客 3044

实现一个new

function Dog(name) { this.name = name this.say = function () { console.log('name = ' + this.name) } } function Cat(name) { this.name = name thi...

anlin9217的博客 338

第10章: MMU notifier与HMM的协作

本文摘要: HMM(Heterogeneous Memory Management)是Linux内核提供的异构内存管理框架,用于统一CPU与设备(如GPU、DSP等)的内存访问。它通过镜像页表技术实现虚拟地址空间共享,自动同步CPU和设备页表变化,支持透明的内存迁移和设备内存管理。HMM构建在mmu_interval_notifier机制上,利用序列号检测页表修改冲突,提供高效并发控制。核心数据结构包括hmm_range和HMM PFN标志位,通过hmm_range_fault()实现页表遍历和缺页处理。

图形/计算GPU的驱动与虚拟化技术分享园地 3098

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

js new关键字干了什么事

【代码】js new关键字干了什么事。

云 4万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

如何实现JavaScript中的 new 关键字

观察下方的代码: // 常见构造函数 function Person(name) { this.name = name } Person.prototype.getName = function() { return this.name } // new 的模拟方法 const objectFactory = function() { let obj = new Object() // 从Object.prototype上克隆一个对象 let Constru

magic_engineer的博客 331

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

JS:new 命令

new 命令:1)基本用法 2)new 原理 3)手写new 4)为了保证构造函数必须与new命令一起使用,两种解决办法

weixin_43932309的博客 965

js自定义new方法

function Person(name, age) { this.name = name; this.age = age; } function New(f) { return function() { ...

379

new操作符到底做了什么?自己实现new

<script> function myNew(fn, ...args) { var obj = {}; obj.__proto__ = fn.prototype; var result = fn.apply(obj, args); return result instan...

Dou_Hua6的博客 254

javascript-实现new运算符

【代码】javascript-实现new运算符。

一些coding知识记录 197

JS手写一个new函数

js手写一个new函数

weixin_47195471的博客 251

手写一个new吧!理解下new的执行流程

/ 将新对象的__proto__赋值为构造函数的prototype。// 如果构造函数返回非空对象,则返回该对象;否则返回新创建的对象。// 构造函数的this指向新对象,并执行代码赋值。// 创建一个新对象。

Kobeloveu 255

当我们在js中使用new时,我们在做什么

当我们在js中使用new时,我们在做什么

holiday19950913的博客 295

JavaScript——new Date().getMonth()

new Date().getMonth(); 说明:参照现在的月份,getMonth()返回的是0-11的数字,也就是说0=1月,1=2月……11=12月 当前的月份就是,new Date().getMonth()+1; 转载于:https://www.cnblogs.com/morven/p/3246220.html...

weixin_33750452的博客 1814

js中的bind方法并模拟实现自己的bind方法

Js中bind方法使用和实现 前面我们已经模拟实现了call和apply方法,今天来实现下同样可以改变this指向但是又有点不同得方法 bind方法。 定义 首先来看下bind方法在mdn中得定义,bind() 方法创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。 语法 function.bind(thisArg[, arg1[, arg2[, …]]]) 参数 thisArg 调用绑定函数时作为 th

前端三脚猫的博客 669
上一篇: 利用css3制作一个3D电子旋转相册
下一篇: 高可维护性TS编码技巧
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值