new的原理即作用:
function Student(name,age){
this.name=name;
this.age=age;
}
var stu=new Student("小明",18);

观察上述代码,Student是一个普通的构造函数,然后通过new对构造函数实例化得到了一个Student类型的数据。

实例语句里面的关系有如下三点:

①:stu.__proto__===Student.prototype;

②:根据规则,当构造函数没有参数的时候,()可以省略。故可知,Student("小明",18)并不是对构造函数的调用,这里new还主动调用了构造函数

③:new还创造了一个容器,让这个容器去调用这个构造函数,并且来装产生的数据对象,并且最后返回这个填装完毕的对象

故当你写下一个new关键字时,new实质上就做了如上三件事
new的最终目的:
创造一个构造函数类别的对象出来,就像new date造出来的是date对象,new array造出来的 是Array对象一样,并且保证这里面的一些继承关系不能乱
new关键字源码:
构造函数:
function Student(name,age){
this.name=name;
this.age=age;
}

mynew函数:

1 function mynew(fn,name,age){
2 var obj={};
3 // 修改原型关系,确定obj一定是由fn造出来的
4 obj.__proto__=fn.prototype;
5 // obj本身没有fn方法,fn是window对象的,于是obj带着借fn所要求的参数去向window借,这样的话,fn借来后obj就可以用了,fn里的this什么的指向的也就是obj了,也可用apply或bind,这也就是修改this指针的原理,this一般是谁调用指向谁
6 var result=fn.call(obj,name,age);
7 // 判断通过构造函数实例化的对象是否为对象,是的话就输出,不是的话就输出新创建的obj
8 return result instanceof Object?result:obj;
9 }

调用:

console.log(mynew(Student,"小明",18)) ;

mynew不带形参的源码,除了mynew函数略有不同,其它均相同

    function mynew(){
var obj={};
// 获取函数调用时传的第一个参数,即为构造函数fn
var fn=[].shift.call(arguments);
// 修改原型关系,确定obj一定是由fn造出来的
obj.__proto__=fn.prototype;
// 修改fn的this指针,arguements必须要转为以逗号相连的数据
fn.call(obj,...arguments);
return obj;
}
console.log(mynew(Student,"小明",18)) ;

箭头函数不能写new:

注意箭头函数不能用来写new的源码,

  • 箭头函数没有自己的 this,无法修改this指针
  • 箭头函数没有自己的 prototype,无法修改原型对象

js之new的原理和源码的更多相关文章

  1. [Spark内核] 第32课:Spark Worker原理和源码剖析解密:Worker工作流程图、Worker启动Driver源码解密、Worker启动Executor源码解密等

    本課主題 Spark Worker 原理 Worker 启动 Driver 源码鉴赏 Worker 启动 Executor 源码鉴赏 Worker 与 Master 的交互关系 [引言部份:你希望读者 ...

  2. [Spark內核] 第41课:Checkpoint彻底解密:Checkpoint的运行原理和源码实现彻底详解

    本课主题 Checkpoint 运行原理图 Checkpoint 源码解析 引言 Checkpoint 到底是什么和需要用 Checkpoint 解决什么问题: Spark 在生产环境下经常会面临 T ...

  3. Dubbo原理和源码解析之服务引用

    一.框架设计 在官方<Dubbo 开发指南>框架设计部分,给出了引用服务时序图: 另外,在官方<Dubbo 用户指南>集群容错部分,给出了服务引用的各功能组件关系图: 本文将根 ...

  4. Dubbo原理和源码解析之标签解析

    一.Dubbo 配置方式 Dubbo 支持多种配置方式: XML 配置:基于 Spring 的 Schema 和 XML 扩展机制实现 属性配置:加载 classpath 根目录下的 dubbo.pr ...

  5. Dubbo原理和源码解析之“微内核+插件”机制

    github新增仓库 "dubbo-read"(点此查看),集合所有<Dubbo原理和源码解析>系列文章,后续将继续补充该系列,同时将针对Dubbo所做的功能扩展也进行 ...

  6. Dubbo原理和源码解析之服务暴露

    github新增仓库 "dubbo-read"(点此查看),集合所有<Dubbo原理和源码解析>系列文章,后续将继续补充该系列,同时将针对Dubbo所做的功能扩展也进行 ...

  7. Java并发编程(七)ConcurrentLinkedQueue的实现原理和源码分析

    相关文章 Java并发编程(一)线程定义.状态和属性 Java并发编程(二)同步 Java并发编程(三)volatile域 Java并发编程(四)Java内存模型 Java并发编程(五)Concurr ...

  8. DStream-05 updateStateByKey函数的原理和源码

    Demo updateState 可以到达将每次 word count 计算的结果进行累加. object SocketDstream { def main(args: Array[String]): ...

  9. 我是如何在短期内快速掌握Dubbo的原理和源码的(纯干货)?

    写在前面 上周,在[Dubbo系列专题]中更新了两篇文章<冰河开始对Dubbo下手了!>和<俯瞰Dubbo全局,阅读源码前必须掌握这些!!>,收到了很多小伙伴的微信私聊消息,大 ...

  10. Kubernetes Job Controller 原理和源码分析(一)

    概述什么是 JobJob 入门示例Job 的 specPod Template并发问题其他属性 概述 Job 是主要的 Kubernetes 原生 Workload 资源之一,是在 Kubernete ...

随机推荐

  1. Invade the Mars

    题目 网上大把 分析 显然不能简单直接最短路 城市被攻占的特点是:保护的城市都被攻占了 那么这个城市被攻占的最早时间必然是所有保护他的城市中最大的被攻占时间 于是我们可以 设 \(dis\) 表示军队 ...

  2. HashTable HashMap concurrentHashMap区别

    HashTable HashMap concurrentHashMap区别 HashMap.HashTable.ConcurrentHashMap都是map接口的实现类 1.(同步性)HashTabl ...

  3. snowland-smx密码算法库

    snowland-smx密码算法库 一.snowland-smx密码算法库的介绍 snowland-smx是python实现的国密套件,对标python实现的gmssl,包含国密SM2,SM3,SM4 ...

  4. 第三周作业-N67044-张铭扬

    1. 图文并茂说明raid0,raid1, raid10, raid01, raid5等原理. "RAID"是指独立硬盘冗余阵列(RAID, Redundant Array of ...

  5. HashMap排序题

    HashMap排序题 题目 已知一个 HashMap<Integer,User>集合, User 有 name(String)和 age(int)属性. 请写一个方法实现对HashMap ...

  6. TensorFlow的基础结构

    Tensorflow 是非常重视结构的, 我们得建立好了神经网络的结构, 才能将数字放进去, 运行这个结构. 这个例子简单的阐述了 tensorflow 当中如何用代码来运行我们搭建的结构. 创建数据 ...

  7. 用js实现元素两个元素位置对齐

    一.问题描述 使得填表单位那一行字与下面的表格左对齐,对表格使用css中的margin:auto实现了居中,但是对那一行字(用div包裹的)使用margin:auto不生效:并且2021年下面对应的月 ...

  8. 题解[HEOI2013]SAO.md

    题意 给定一棵树,边有方向.要给点重标号,使得边都由小编号指向大编号,求重标号方案数. \(n\le10^5\) 思路 有关树的计数.套路性考虑树形 DP. 设计状态 \(f_{u}\) 表示 \(u ...

  9. html 1.0

    <html><head> <title></title></head><body><h3 align="cent ...

  10. Lazarus 开发环境使用技巧

    Lazarus 开发环境使用技巧 1.代码补全 按下键盘的Ctrl+W键!输入变量后按下这个键就OK啦- 2.自动完成 自动完成的快捷键大多数都冲突了,解决方法是打开 工具(T)->选项...- ...