js中new到底做了什么?如何重写new?
new 构造函数()执行顺序
1.在堆中开辟对象内存空间, 记为obj
2.在obj 中添加__proto__属性并指向 构造函数.prototype
3.将构造函数中的this 指向obj
4.执行构造函数内语句
若构造函数中没有reutrn 或return this或基本类型(number、string、boolean、null、undefined)的值,则返回obj在堆中的内存地址;若return 引用类型,则返回值为这个引用类型
仿写new的行为
function People(name, age, phone) {
this.name = name;
this.age = age;
this.phone = phone;
//若构造函数中`没有reutrn 或return this或基本类型`(number、string、boolean、null、undefined)的值,则返回obj在堆中的内存地址;若`return 引用类型`,则返回值为这个引用类型
// return null;//无影响
// return {};//返回此对象
// return function(){};//返回此函数
} function _new(...args) {
let constructor = args[0];//获取构造函数
let obj = Object.create(constructor.prototype);//创建空对象,并将原型指向构造函数的原型
let res = constructor.call(obj, ...args.slice(1));//call强行将this指向第一个参数
if ((typeof res === 'object' || typeof res === 'function') && res != null) {
return res;
} else {
return obj;
}
} let a = _new(People, 'aa', 20, 132456);
let na = new People('aa', 20, 132456);
console.log(a, na);
//运行结果
People { name: 'aa', age: 20, phone: 132456 }
People { name: 'aa', age: 20, phone: 132456 }
————————————————
版权声明:本文为CSDN博主「漫疏狂」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lyt_angularjs/article/details/86623988
js中new到底做了什么?如何重写new?的更多相关文章
- js中new到底做了什么?
1.创建一个新的obj; 2.让obj_proto_=Func.prototype; 3.Func.call(obj);
- JS中new到底发生了什么
outline prototype 与 __proto__ function 与 object new 到底发生了什么 prototype 与 __proto__ 首先说下在JS中比较容易让人困惑的 ...
- js 中this到底指向哪里?
其实js的this指向很简单.我们记住下面3种情况. this 指向的是浏览器中的window.代码如下: function fn(){ this.name='yangkun'; this.age=2 ...
- js中‘0’到底是 true 还是 false
if ('0') alert("'0' is true"); if ('0' == false) alert("'0' is false");结果是,两次都 ...
- JS中this到底指哪个对象
忘了原作者是谁了 自己也添加了一些东西 勉强可以观看一下 元素就不写了 可以自己添一下试试 先看这段代码 target.onclick = function(){ console.log(t ...
- SSM-MyBatis-06:Mybatis中openSession到底做了什么
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 1.找SqlSesionFactory实现类 Ctrl+H:DefaultSqlSessionFactory: ...
- JS中switch语句做选择时为什么可以不用break?
在JavaScript中,switch语句相比其他语言并没有特殊之处. 在使用时,我们要注意每个分支后都应加一条break语句,否则后面的分支仍然会执行.实际程序中,我发现有时没用break语句,仍然 ...
- JS中this到底指向谁?
关于this的指向,是一个令人很头疼的问题.但是,你运气好,碰到了我.老夫这儿有本祖传秘籍,看懂这个,妈妈再也不用担心你的this指向不对啦! 归根结底,this指向就一句话:谁最终调用函数,this ...
- js new到底做了什么?如何重写new?(转)
转自:https://blog.csdn.net/lyt_angularjs/article/details/86623988
随机推荐
- websphere部署不能发布war文件,提示“配置库中已存在应用程序
碰上这种问题, 要是全删除与war相关配置文件,要么按网上教程,一点点搜下面的文件中包含的相关文件: $WAS_HOME/profiles/AppSrv01/config/cells/...cell/ ...
- Mybaits和Spring的那点事
前言 在spring中使用mybaits简直不要太简单,只需要几个配置,一个DAO接口和一个mapper.xml就可以完成一次数据库交互.但是简单背后往往是复杂的实现,现在我们来探讨一下里面的一点原理 ...
- mongodb aggregate 聚合 操作(扁平化flatten)
mongodb自带的函数非常多,最近用mongo做持久化数据库,遇到一个需求:子文档是个数组,把数组里的各个字段扁平化合到根文档中,查过资料后(主要是mongodb的文档和stackoverflow) ...
- 【React自制全家桶】八、React动画以及react-transition-group动画库的使用
React动画通常有三种方法实现从易到难为: 1.transition(CSS3自带) 2.animation(CSS3自带) 3.react-transition-group动画库(需要引入插件) ...
- 路由设置中"DHCP服务器"启用或不启用是干嘛的?
“DHCP服务器”启用的话,每一台连接这个路由器的电脑都会自动获取一个IP地址,并且不会跟其他电脑的想冲突:“DHCP服务器”不启用就必须手动给每一台连接这个路由器的电脑设置本地连接里面的“inter ...
- 一张图搞懂Ajax原理
本文整理在,我的github上.欢迎Star. 原理 说起ajax,就不得不说他背后的核心对象XMLHttpRequest,而说到XMLHttpRequest我觉得,从它的readyState状态说起 ...
- linux卸载Python3
一.卸载Python3 1.卸载python3 rpm -qa|grep python3|xargs rpm -ev --allmatches --nodeps 卸载pyhton3 2.whereis ...
- python programming GUI综合实战(在GUI上画图)
import os import platform import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5 ...
- nvm 安装及操作 node版本管理
安装 > curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.1/install.sh | bash 安装完成后重启下 ...
- IDEA 控制台中文乱码的问题
-Dfile.encoding=UTF-8