new操作符的实现原理
new操作符的实现原理
new 可以用来实例化一个类,从而在内存中分配一个实例对象。
new操作符的执行过程:
- 首先创建了一个新的空对象
- 设置原型,将空对象的隐式原型设置为构造函数的 prototype 对象。
- 让函数的 this 指向这个新创建的空对象,执行构造函数的代码。为新创建的空对象添加属性。
- 判断调用函数过后的返回值类型,如果是基本数据类型,则返回创建的对象。如果是引用类型,就返回这个引用类型的对象。
代码如下
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.按位与运算& 按位与运算的底层运算过程如下 十进制: 3&5=1 二进制 0011&0101 = 0001 按位与运算就 ...
- 初学JavaScript之猜测new操作符的原理
本文是一篇原理猜测的文章,如果有不准确的地方请指正, 原文:http://blog.csdn.net/softmanfly/article/details/34833931 JavaScript中构造 ...
- 浅谈 instanceof 和 typeof 的实现原理
typeof 实现原理 typeof 一般被用于判断一个变量的类型,我们可以利用 typeof 来判断number, string, object, boolean, function, undefi ...
- RxJs map operator 工作原理分析
使用一个例子来研究 map 操作符的工作原理. 推荐阅读本文之前,先浏览这篇文章RxJs fromEvent 工作原理分析以了解相关知识. 源代码: import { Component, OnIni ...
- C++11六大函数(构造函数,移动构造函数,移动赋值操作符,复制构造函数,赋值操作符,析构函数)
转载自:http://blog.csdn.net/jofranks/article/details/17438955 版权声明:本文为博主原创文章,未经博主允许不得转载. 在C++中,有三大函数复制控 ...
- C和指针 第5章 操作符和表达式 5.1 操作符
操作符和表达式 C提供了编程语言应该拥有的所有操作符,它甚至提供了一些令人意想不到的操作符.事实上,C被许多人所诟病的一个缺点就是它有品类繁多的操作符.此外,C的许多操作符具有其他语言的操作符 ...
- new操作符的执行过程
new操作符的实现原理 new操作符的执行过程: (1)首先创建了一个新的空对象 (2)设置原型,将对象的原型设置为函数的 prototype 对象. (3)让函数的 this 指向这个对象,执行构造 ...
- 编译器 LLVM Clang原理与实战 制作自己的编译器 source-to-source 源代码转换 编译遍 compile pass 代码插桩
编译器 LLVM Clang原理与实战 参考1 clang LLVM CMU 教案 深入剖析-iOS-编译-Clang-LLVM LLVM_proj LLVM编程索引 llvm源码浏览带跳转 llvm ...
- java substring实现_Java中substring()工作原理
01.substring() 是干嘛的 sub 是 subtract 的缩写,因此 substring 的字面意思就是"把字符串做个减法".这样一分析,是不是感觉方法的命名还是蛮有 ...
最新文章
- 分布式与集群是一回事儿么?别让这么简单的问题难住你!
- 定义一个员工类(JAVA)
- 函数指针及其定义和用法,C++函数指针详解(附用法代码和注意事项)
- 查询SDE数据库,GSON报错:declares mutiple JSON fields named data
- Java 将数据写入磁盘并读取磁盘上的文件
- 计算机数学基础试题,计算机数学基础(A)综合练习
- 完整的 .NET Core 目标框架的预处理器符号列表
- VMware虚拟机CentOS7 - VMnet8网络配置及常见问题解决
- js控制网页WMP播放的属性
- 移动UI 设计---色彩有哪些象征意义
- 期货反向跟单门槛高吗,中小群体个人能不能做
- 教务系统自动评教_新版正方教务管理系统自动评教脚本
- EF Data Operation With Async Task
- SMETA验厂辅导,对于已经通过了审核公司的ETI标准验厂,如何将验厂结果上传到SEDEX上
- docker学习(容器虚拟化技术---华子需要)
- 关于时间与字符串相互转换
- 初步使用Arduino
- YOLOv5错误提示( torchvision和torch版本不兼容)
- 程序员学炒股(4) 早晨十字星靠不靠谱
- 大数据驱动智能制造,物联网引爆工业革命商机