前提,要明白new出来的实例是什么,包含了哪些内容?

请看一下举例代码↓↓↓↓

function Person(name,age){
this.name = name;
this.age = age;
} let p =new Person('pxx',18);
console.log(p);
// 控制台打印
Person {name: "pxx", age: 18}
age: 18
name: "pxx"
__proto__:
constructor: ƒ Person(name,age)
__proto__: Object

从上面例子可以得出以下结论:

  • new出来的是一个对象
  • 对象上有一个__proto__属性,值为Person的原型
  • 同时对象上还有构造函数执行的属性

但是还有一点上面例子没有体现,就是假如构造函数本身返回的就是一个对象时的情况,我们稍加改造↓↓↓↓

1.返回值是基本数据类型

function Person(name,age){
this.name = name;
this.age = age;
return 'test'
}
let p =new Person('pxx',18);
console.log(p);
// 控制台打印内容
Person {name: "pxx", age: 18}
age: 18
name: "pxx"
__proto__: Object

2.返回值是对象


function Person(name,age){
this.name = name;
this.age = age;
return {
name: 'other',
age: 20
}
}
let p =new Person('pxx',18);
console.log(p);
// 控制台打印如下
{name: "other", age: 20}
  age: 20
  name: "other"
  __proto__: Object

可以看出,当构造函数返回的是一个对象时,new出来的实例就是函数的返回值。

通过以上分析,我们可以按步骤写出自己的一个new方法

具体步骤如下:

  1. 建立一个空对象
  2. 为空对象添加__proto__属性
  3. 在空对象上执行构造函数
  4. 判断合法返回值

最终源码如下↓↓↓↓↓↓↓↓↓↓↓↓

function myNew(Fn,...args){
// 1.新建空对象
let o = {};
// 2.对象的__proto__ 属性指向原型
o.__proto__ = Fn.prototype;
// 3.以对象为this,执行构造函数
let res = Fn.apply(o,args);
// 4.返回合法值
return res instanceof Object? res : o;
} let p1 = myNew(Person,'pxx',18);
console.log(p1);

new一个实例的原理及过程的更多相关文章

  1. Servlet实现前后端交互的原理及过程解析

    在日常调试项目时,总是利用tomcat去启动项目,并进行前后端联调,但对于前后端的请求响应的交互原理及过程并不是特别清晰. 为什么在前端发出相应请求,就能跳转到后端通过程序得到结果再响应到前端页面呢? ...

  2. 阿里面试官:Android中binder机制的实现原理及过程?

    Binder 是 Android 系统中非常重要的组成部分.Android 系统中的许多功能建立在 Binder 机制之上.在这篇文章中,我们会对 Android 中的 Binder 在系统架构中的作 ...

  3. Synchronized锁升级原理与过程深入剖析

    Synchronized锁升级原理与过程深入剖析 前言 在上篇文章深入学习Synchronized各种使用方法当中我们仔细介绍了在各种情况下该如何使用synchronized关键字.因为在我们写的程序 ...

  4. Java 类的实例变量初始化的过程 静态块、非静态块、构造函数的加载顺序

    先看一道Java面试题: public class Baset { private String baseName = "base"; // 构造方法 public Baset() ...

  5. AJAX异步请求原理和过程

    AJAX 指异步 JavaScript 及 XML(Asynchronous JavaScript And XML),它不是一种新的编程语言,而是一种使用现有标准的新方法. AJAX 基于 JavaS ...

  6. 苹果公司的新的编程语言 Swift 高级语言(十一)--初始化类的析构函数的一个实例

    一 .实例的初始化          实例的初始化是准备一个类.结构或枚举的实例以便使用的过程. 初始化包含设置一个实例的每个存储属性为一个初始值,以及运行不论什么其他新的实例可以使用之前须要的设置或 ...

  7. vue.js+webpack在一个简单实例中的使用过程demo

    这里主要记录vue.js+webpack在一个简单实例中的使用过程 说明:本次搭建基于Win 7平台 Node.js 安装官网提供了支持多种平台的的LTS版本下载,我们根据需要来进行下载安装.对于Wi ...

  8. vc++高级班之窗口篇[4]---让程序只运行一个实例

      大家都看过或者使用过类似只运行一个实例的程序,比如:QQ游戏.部分浏览器 等等! 让一个程序只运行一个实例的方法有多种,但是原理都类似,也就是在程序创建后,有窗口的程序在窗口创建前, 检查系统中是 ...

  9. python 单例模式,一个类只能生成唯一的一个实例,重写__new__方法详解

    单例:一个类只能生成唯一的一个实例 每个类只要被实例化了,他的私有属性 '_instance'就会被赋值,这样理解对吗 对 #方法1,实现__new__方法 #并在将一个类的实例绑定到类变量_inst ...

  10. Sql Server tempdb原理-启动过程解析实践

    我们知道在SqlServer实例启动过程中数据库会进行还原(Redo,Undo)然后打开提供服务,但我们知道tempdb是不提供重做机制的(Redo)那tempdb是如何还原的呢?如果tempdb损坏 ...

随机推荐

  1. centos5.7 x64,安装java17,提示 glibc 版本低

    安装java17,网站下载tar版本. 解压后,配置/etc/profile 的java_home,和path, 运行java -version  和 javac -version  提升缺少GLIB ...

  2. Characterizing possible failure modes in physics-informed neural network

    NeurIPS 2021 表征PINN中可能的失败模式.本文的思路也比较简单,通过对PINN的优化域进行观察,发现导致PINN训练的原因并不是因为神经网络的表达力不足,而是由于PINN中引入了基于PD ...

  3. Hyperledger fabric 2.2.0 环境搭建

    基础环境搭建 ### docker 安装 如果服务器上有旧版的docker,需要先执行卸载操作. $ sudo yum remove docker \ docker-common \ docker-s ...

  4. git将自己分支上忽略已修改但不需要的提交的文件

    一:在idea上把需要提交的文件勾选上提交 二:git stash命令将余下被修改的文件存入(隐藏)暂存区 git stash 三:切换master分支合并上述分支 四:合并后再返回上述分支,git ...

  5. 多线程学习(第二天)Java内存模型

    一.内存模型基础 Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式进行,整个通信过程对程序员完全透明. 如果编写多线程程序的Java程序员不理解隐式进行的线程之间通信的工作机制,很可 ...

  6. EasyExcel工具使用

    pom文件: <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel< ...

  7. Activiti5.22.0扩展支持达梦数据库

    前言 目前国内部分公司做的项目要求去ioe使用国产的替代方案.数据从异构数据库中迁移到达梦,应用中使用Activiti工作流在替换了数据库驱动后启动过程报错如下: nested exception i ...

  8. 通过nft持有大户地址获取正常交易和内部交易

    /*内部交易*/------------ CREATE TABLE `internal_txlist` ( `blockNumber` varchar(255) DEFAULT NULL, `tx_t ...

  9. python 判断一个字符串中是否存在另一个字串中的元素

    如 判断str是否包含str_list中的元素 str = "this is string example....wow!!!" str_list = ['aa','bb','st ...

  10. 高性能的StampedLock锁

    StampedLock 支持的三种锁模式: 1.ReadWriteLock 支持两种模式:一种是读锁,一种是写锁 2.StampedLock 支持三种模式,分别是:写锁.悲观读锁和乐观读 1)写锁.悲 ...