js之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还创造了一个容器,让这个容器去调用这个构造函数,并且来装产生的数据对象,并且最后返回这个填装完毕的对象
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的原理和源码的更多相关文章
- [Spark内核] 第32课:Spark Worker原理和源码剖析解密:Worker工作流程图、Worker启动Driver源码解密、Worker启动Executor源码解密等
本課主題 Spark Worker 原理 Worker 启动 Driver 源码鉴赏 Worker 启动 Executor 源码鉴赏 Worker 与 Master 的交互关系 [引言部份:你希望读者 ...
- [Spark內核] 第41课:Checkpoint彻底解密:Checkpoint的运行原理和源码实现彻底详解
本课主题 Checkpoint 运行原理图 Checkpoint 源码解析 引言 Checkpoint 到底是什么和需要用 Checkpoint 解决什么问题: Spark 在生产环境下经常会面临 T ...
- Dubbo原理和源码解析之服务引用
一.框架设计 在官方<Dubbo 开发指南>框架设计部分,给出了引用服务时序图: 另外,在官方<Dubbo 用户指南>集群容错部分,给出了服务引用的各功能组件关系图: 本文将根 ...
- Dubbo原理和源码解析之标签解析
一.Dubbo 配置方式 Dubbo 支持多种配置方式: XML 配置:基于 Spring 的 Schema 和 XML 扩展机制实现 属性配置:加载 classpath 根目录下的 dubbo.pr ...
- Dubbo原理和源码解析之“微内核+插件”机制
github新增仓库 "dubbo-read"(点此查看),集合所有<Dubbo原理和源码解析>系列文章,后续将继续补充该系列,同时将针对Dubbo所做的功能扩展也进行 ...
- Dubbo原理和源码解析之服务暴露
github新增仓库 "dubbo-read"(点此查看),集合所有<Dubbo原理和源码解析>系列文章,后续将继续补充该系列,同时将针对Dubbo所做的功能扩展也进行 ...
- Java并发编程(七)ConcurrentLinkedQueue的实现原理和源码分析
相关文章 Java并发编程(一)线程定义.状态和属性 Java并发编程(二)同步 Java并发编程(三)volatile域 Java并发编程(四)Java内存模型 Java并发编程(五)Concurr ...
- DStream-05 updateStateByKey函数的原理和源码
Demo updateState 可以到达将每次 word count 计算的结果进行累加. object SocketDstream { def main(args: Array[String]): ...
- 我是如何在短期内快速掌握Dubbo的原理和源码的(纯干货)?
写在前面 上周,在[Dubbo系列专题]中更新了两篇文章<冰河开始对Dubbo下手了!>和<俯瞰Dubbo全局,阅读源码前必须掌握这些!!>,收到了很多小伙伴的微信私聊消息,大 ...
- Kubernetes Job Controller 原理和源码分析(一)
概述什么是 JobJob 入门示例Job 的 specPod Template并发问题其他属性 概述 Job 是主要的 Kubernetes 原生 Workload 资源之一,是在 Kubernete ...
随机推荐
- js获取时间戳的方法
js获取时间戳的方法 转载脚本之家: https://www.jb51.net/article/77066.htm 转载博客园八英里: https://www.cnblogs.com/deepalle ...
- PHP封装自定义函数function
最近一直在看PHP教程,毕竟懂点PHP语言还是不错的选择,起初是准备制作一个三文件夹内关键词组合长尾关键词,然后用PHP做一个全站的动态聚合页面的一个PHP插件,不负有心人啊!已写好,稍晚整理会在资源 ...
- WPF ScrollViewer 没有效果
ScrollViewer组件外组件如果是StackPanel组件 需要给StackPanel 设置高度,ScrollViewer 才会有滚动条 如果不想设置StackPanel高度,可以把StackP ...
- LeetCode-689 三个无重叠子数组的最大和
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-sum-of-3-non-overlapping-subarrays 题目描述 ...
- 个人常用的git提交代码流程
# 增加⼀一个新的远程仓库,并命名git remote add [shortname] [url] # 新建一个本地目录,将其初始化为 Git 代码库$ git init [project-name] ...
- ubuntu20.04虚拟机无法自动获取IP地址
具体操作 # ens33 为网卡名称 sudo dhclient ens33
- 正点原子sys.h文档详解
文档主体内容为位带的映射,目的是实现位带操作. 第一部分:位带映射的宏函数 1 #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x200 ...
- C# DevExpress GridControl下动态创建列的方法
这里是把在表格中创建控件的方法封装成一个类,然后在创建列的时候实例化"创建控件"的方法 1.在列中使用一些按钮 1 using Common; 2 using DevExpress ...
- Qt控制台输出显示乱码
Qt控制台输出显示乱码 https://jingyan.baidu.com/article/ab69b2709aab0b2ca7189f3d.html
- drf从入门到飞升仙界 08
断点调试使用 # 程序在debug模式运行,可以在任意位置停下,查看当前情况下变量数据的变化情况 # 使用pycharm调试程序 - 1.以debug模式运行. - 2.在代码左侧加入断点(红圈) - ...