new操作符的实现原理

new 可以用来实例化一个类,从而在内存中分配一个实例对象。

new操作符的执行过程:

  1. 首先创建了一个新的空对象
  2. 设置原型,将空对象的隐式原型设置为构造函数的 prototype 对象。
  3. 让函数的 this 指向这个新创建的空对象,执行构造函数的代码。为新创建的空对象添加属性。
  4. 判断调用函数过后的返回值类型,如果是基本数据类型,则返回创建的对象。如果是引用类型,就返回这个引用类型的对象。

代码如下

 function _new() {//获取第一个参数const fn = Array.prototype.shift.call(arguments);//获取后面要传入构造函数内的参数const args = Array.from(arguments);//判断第一个参数是否是一个函数,如果不是抛出类型错误if (typeof fn !== 'function') {throw new TypeError('a is not a constructor')}// 新建一个空对象,对象的隐式原型为构造函数的 prototype 对象const obj = Object.create(fn.prototype)//将构造函数内部的this指向obj,并执行,获取函数返回值const result = fn.apply(obj, args)//判断函数返回的值是否是引用数据类型if (result instanceof Object) {//如果是返回该函数的返回值return result;} else {//如果不是就返回objreturn obj;}}function add(name,age) {this.name = name;this.age = age;}add.prototype.say = function () { console.log(`我叫${this.name},今年${this.age}岁`)}const test =  _new(add,'马老板',20)console.log(test) // add {name: '马老板', age: 20}test.say() //我叫马老板,今年20岁

new操作符的实现原理相关推荐

  1. 按位运算操作符底层实现原理

    本篇文章给大家讲解编程软件中的运算符底层实现原理! 1.按位与运算& 按位与运算的底层运算过程如下 十进制: 3&5=1 二进制 0011&0101 = 0001 按位与运算就 ...

  2. 初学JavaScript之猜测new操作符的原理

    本文是一篇原理猜测的文章,如果有不准确的地方请指正, 原文:http://blog.csdn.net/softmanfly/article/details/34833931 JavaScript中构造 ...

  3. 浅谈 instanceof 和 typeof 的实现原理

    typeof 实现原理 typeof 一般被用于判断一个变量的类型,我们可以利用 typeof 来判断number, string, object, boolean, function, undefi ...

  4. RxJs map operator 工作原理分析

    使用一个例子来研究 map 操作符的工作原理. 推荐阅读本文之前,先浏览这篇文章RxJs fromEvent 工作原理分析以了解相关知识. 源代码: import { Component, OnIni ...

  5. C++11六大函数(构造函数,移动构造函数,移动赋值操作符,复制构造函数,赋值操作符,析构函数)

    转载自:http://blog.csdn.net/jofranks/article/details/17438955 版权声明:本文为博主原创文章,未经博主允许不得转载. 在C++中,有三大函数复制控 ...

  6. C和指针 第5章 操作符和表达式 5.1 操作符

    操作符和表达式     C提供了编程语言应该拥有的所有操作符,它甚至提供了一些令人意想不到的操作符.事实上,C被许多人所诟病的一个缺点就是它有品类繁多的操作符.此外,C的许多操作符具有其他语言的操作符 ...

  7. new操作符的执行过程

    new操作符的实现原理 new操作符的执行过程: (1)首先创建了一个新的空对象 (2)设置原型,将对象的原型设置为函数的 prototype 对象. (3)让函数的 this 指向这个对象,执行构造 ...

  8. 编译器 LLVM Clang原理与实战 制作自己的编译器 source-to-source 源代码转换 编译遍 compile pass 代码插桩

    编译器 LLVM Clang原理与实战 参考1 clang LLVM CMU 教案 深入剖析-iOS-编译-Clang-LLVM LLVM_proj LLVM编程索引 llvm源码浏览带跳转 llvm ...

  9. java substring实现_Java中substring()工作原理

    01.substring() 是干嘛的 sub 是 subtract 的缩写,因此 substring 的字面意思就是"把字符串做个减法".这样一分析,是不是感觉方法的命名还是蛮有 ...

最新文章

  1. 分布式与集群是一回事儿么?别让这么简单的问题难住你!
  2. 定义一个员工类(JAVA)
  3. 函数指针及其定义和用法,C++函数指针详解(附用法代码和注意事项)
  4. 查询SDE数据库,GSON报错:declares mutiple JSON fields named data
  5. Java 将数据写入磁盘并读取磁盘上的文件
  6. 计算机数学基础试题,计算机数学基础(A)综合练习
  7. 完整的 .NET Core 目标框架的预处理器符号列表
  8. VMware虚拟机CentOS7 - VMnet8网络配置及常见问题解决
  9. js控制网页WMP播放的属性
  10. 移动UI 设计---色彩有哪些象征意义
  11. 期货反向跟单门槛高吗,中小群体个人能不能做
  12. 教务系统自动评教_新版正方教务管理系统自动评教脚本
  13. EF Data Operation With Async Task
  14. SMETA验厂辅导,对于已经通过了审核公司的ETI标准验厂,如何将验厂结果上传到SEDEX上
  15. docker学习(容器虚拟化技术---华子需要)
  16. 关于时间与字符串相互转换
  17. 初步使用Arduino
  18. YOLOv5错误提示( torchvision和torch版本不兼容)
  19. 程序员学炒股(4) 早晨十字星靠不靠谱
  20. 大数据驱动智能制造,物联网引爆工业革命商机

热门文章

  1. 收敛速度:线性收敛,超线性收敛,r 阶收敛
  2. 面试分享:手机收费问题面试
  3. 逐步回归matlab函数,Matlab逐步回归
  4. 强化学习 马尔科夫决策过程(MDP)
  5. Windows Vista Ultimate 简体中文旗舰版 32位
  6. windows常用系统库
  7. 如何制作透明的树Shader和一个玻璃Shader
  8. String类的方法摘要
  9. USB大容量存储设备Bulk Only传输过程
  10. Hive技巧-选出某些列其余所有的列