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?的更多相关文章

  1. js中new到底做了什么?

    1.创建一个新的obj; 2.让obj_proto_=Func.prototype; 3.Func.call(obj);

  2. JS中new到底发生了什么

    outline prototype 与 __proto__ function 与 object new 到底发生了什么 prototype 与 __proto__ 首先说下在JS中比较容易让人困惑的  ...

  3. js 中this到底指向哪里?

    其实js的this指向很简单.我们记住下面3种情况. this 指向的是浏览器中的window.代码如下: function fn(){ this.name='yangkun'; this.age=2 ...

  4. js中‘0’到底是 true 还是 false

    if ('0') alert("'0' is true");  if ('0' == false) alert("'0' is false");结果是,两次都 ...

  5. JS中this到底指哪个对象

    忘了原作者是谁了   自己也添加了一些东西  勉强可以观看一下 元素就不写了   可以自己添一下试试 先看这段代码 target.onclick = function(){ console.log(t ...

  6. SSM-MyBatis-06:Mybatis中openSession到底做了什么

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 1.找SqlSesionFactory实现类 Ctrl+H:DefaultSqlSessionFactory: ...

  7. JS中switch语句做选择时为什么可以不用break?

    在JavaScript中,switch语句相比其他语言并没有特殊之处. 在使用时,我们要注意每个分支后都应加一条break语句,否则后面的分支仍然会执行.实际程序中,我发现有时没用break语句,仍然 ...

  8. JS中this到底指向谁?

    关于this的指向,是一个令人很头疼的问题.但是,你运气好,碰到了我.老夫这儿有本祖传秘籍,看懂这个,妈妈再也不用担心你的this指向不对啦! 归根结底,this指向就一句话:谁最终调用函数,this ...

  9. js new到底做了什么?如何重写new?(转)

    转自:https://blog.csdn.net/lyt_angularjs/article/details/86623988

随机推荐

  1. Socket——实现一个简单的静态网页服务器

    整体结构就是使用ServerSocket监听一个地址,当有接受到请求之后,解析请求中的资源路径.服务器资源路径存放在项目下的一个目录中,服务器会到这个目录中根据请求的路径去寻找相应的资源.如果找到了则 ...

  2. GitHub:Tencent

    ylbtech-GitHub:Tencent 1.返回顶部 1. https://opensource.tencent.com/ 2. 2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶 ...

  3. java逆向工程-mybatis-generator

    题记:在快速开发的项目中有使用到,这样可以避免冗余工作 声明:参考于https://www.cnblogs.com/smileberry/p/4145872.html 环境:必须先安装maven环境, ...

  4. 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_8 响应json数据之响应json格式数据

    springMvc的框架已经帮我们做好了.发过来的数据转换为javaBean对象 发过来的键值的形式,如果属性和javaBean对应的话,可以直接封装到对象中. key做额外的转换的时候,需要另外的j ...

  5. Implementing a Dynamic Vector (Array) in C(使用c实现动态数组Vector)

    An array (vector) is a common-place data type, used to hold and describe a collection of elements. T ...

  6. Structured streaming: A Declarative API for Real-Time Applications in Apache Spark(Abstract: 原文+注译)

    题目中文:结构化流: Apache spark中,处理实时数据的声明式API Abstract with the ubiquity of real-time data, organizations n ...

  7. C# 创建桌面快捷方式 用法

    项目--->添加引用   找到 头部 using IWshRuntimeLibrary; 核心代码 string desktoppath = System.Environment.GetFold ...

  8. 【HANA系列】SAP HANA SQL条件判断是NULL的写法

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL条件判断 ...

  9. Centos6.4安装配置mysql

    大数据开发需要读取关系型数据库内的数据,学习过程中主要使用mysql进行学习,以下记录mysql的安装与配置过程. 1.mysql简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司 ...

  10. linux中配置双网卡的目的?如何实现双网卡绑定,以实现负载均衡?

    配置双网卡的目的:========================== 1.你想做路由器,网关 2.实现冗余 3.负载均衡     linux 主机安装双网卡,共享一个IP地址,对外提供访问,实际 同 ...