前提,要明白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. SVD动态图

    library(gganimate) library(gifski) # 构造数据 phi<-pi/6 theta<-pi/3 c<-matrix(c(cos(phi),sin(ph ...

  2. vue-awesome-swiper使用中的一些问题

    项目中使用了vue-awesome-swiper,发现autoplay不能用.网上找了半天,说是版本问题.最后在main.js中添加以下代码解决. import VueAwesomeSwiper fr ...

  3. 【Python3+Selenium】基本操作

    一.环境准备 1.Selenium安装教程 1.1 打开cmd,输入如下命令:pip/pip3 install selenium 1.2 安装完成后查看Python路径包管理(Lib\site-pac ...

  4. 【Python】变量&数据类型&运算符

    一.Python变量&数据类型&运算符 1.print()函数 1.1 输出数字,字符串,含有运算符的表达式 print(123) print('hello world') print ...

  5. ResponseUtil 请求返回

    package com.infosec.sso.common; import java.io.IOException; import java.util.HashMap; import java.ut ...

  6. python实现图片转PDF

    import os from PIL import Image from reportlab.pdfgen import canvas def image_resize(img, width, hei ...

  7. host头攻击

    一.问题源起 HTTP1.1规范中在增加了HOST头信息,用于存储服务端与客户端的路由信息. 例如: Request的Header里就有一个标名请求,它是用来记录服务端网站域名的. 如果前端或者后台正 ...

  8. IDEA打包普通java项目并用java命令运行

    IDEA下打包为jar包,普通java项目(非web项目) 效果是将第三方jar包放到一个文件夹中(如lib),这样看起来清晰一些.如下图这种: 1.项目结构. 1.关键:modules 在<o ...

  9. 【Java】List

    对List中map集合中某个字段排序 升序排列 方法1 Collections.sort(maps, new Comparator<Map<String, Object>>() ...

  10. holiday08

    第八天 管道 linux允许将 一个命令的输出 可以 通过管道 作为 另一个命令的输入 ls -lh | more 可以理解现实生活中的管子,管子一头塞东西进去,另一头取出来,这里 | 的左右分为两端 ...