new一个对象的原理是怎样的呢?

    1. 用new Object() 的方式新建了一个对象 obj
    1. 取出第一个参数,就是我们要传入的构造函数。此外因为 shift 会修改原数组,所以 arguments 会被去除第一个参数
    1. 将 obj 的原型指向构造函数,这样 obj 就可以访问到构造函数原型中的属性
    1. 使用 apply,改变构造函数 this 的指向到新建的对象,这样 obj 就可以访问到构造函数中的属性
    1. 返回 obj

如何模拟实现一个自己的new构造器?

// v1function objectFactory() {var obj = new Object(),// 因为 shift 会修改原数组,所以 arguments 会被去除第一个参数Constructor = [].shift.call(arguments);     // 拿到伪数组中的第一个参数// 取出参数中的第一个参数,就是我们要传入的构造函数,建立继承关系obj.__proto__ = Constructor.prototype;Constructor.apply(obj, arguments);return obj;}// v2 : 还需要判断返回的值是不是一个对象,如果是一个对象,我们就返回这个对象,如果没有,我们该返回什么就返回什么。function objectFactory() {var obj = new Object(),Constructor = [].shift.call(arguments);// 建立继承关系(二者之间的关系)obj.__proto__ = Constructor.prototype;// 开始执行这个构造函数var ret = Constructor.apply(obj, arguments);// 看一下构造函数的返回值,是对象还是一个基本数据类型?return typeof ret === 'object' ? ret : obj;}// v4:Object.create的原理// var obj = Object.create(Constructor.prototype);// 等价于:// var obj = new Object();// obj.__proto__ = Constructor.prototype;const _new = function () {var Constructor = [].shift.call(arguments);// 1. 创建一个对象,这个对象要继承与构造函数的原型对象var obj = Object.create(Constructor.prototype);// 2. 执行这个构造函数var ret = Constructor.apply(obj, arguments);return typeof ret === 'object' ? ret || obj : obj;}// v5: 实现一个自己的new构造函数const _new = function() {// 从Object.prototype上克隆一个对象 var obj = new Object();// 取出来外部传入的构造器var Constructor = [].shift.call(arguments);// 使用一个中间的函数来维护原型的关系var F = function(){};F.prototype = Constructor.prototype;obj = new F();// 开始执行这个构造函数var res = Constructor.apply(obj, arguments);// 确保构造器总是返回一个对象(使用res || obj 的方式来防止返回null参数)return typeof res === 'object' ? res || obj : obj;}

【Javascript高级知识】深入剖析JS中New一个对象的过程(实现原理)相关推荐

  1. JavaScript高级知识汇总(高级篇)

    目录 JavaScript高级知识总结(高级篇) 一.深入基础 1.1数据类型 1.2数据变量与内存 1.3对象 1.4函数 回调函数 1.5 IIFE 1.6函数中的this 二.函数高级 2.1原 ...

  2. 【javascript基础——系列10】js中隐藏元素的几种方法以及代码

    系列文章 [javascript基础--系列1]前端页面ajax连接后台服务器传输数据 [javascript基础--系列2]前端页面axios连接后台服务器传输数据 [javascript基础--系 ...

  3. AJAX技术入门 第五节 Javascript高级知识

    1.数组 Javascript中数组的大小是可以动态改变的 数组常用的方法: concat:合并数组,不会改变原数组,返回一个新的数组 join:将数组中的内容按照方法参数指定的字符连接成字符串并返回 ...

  4. JavaScript基础(3)-JS中的面向对象、定时器、BOM、位置信息

    一.创建对象的几种常用方式. 1.使用Object或对象字面量创建对象: a.使用Object()内置的构造函数来创建对象,例如: var student = new Object(); // 创建一 ...

  5. Javascript基础知识 1(JS)

    目录 1.了解JavaScript 1.语言: 2.特点: 3.作用 4.js的组成 5.三种书写位置 2.js输入输出语句 1.输出语句 2.输入语句 3.js变量 1.变量 3.变量语法扩展 4. ...

  6. 【JavaScript学习笔记2】JS中常见的输出方式-控制台输出信息

    引言 在编程开发的过程中,输出信息是非常必要的.JS中提供了四种输出方式:弹出显示框.控制台输出.弹出输入框.弹出判断显示框 弹出显示框 这种方式在上一篇笔记中已经详细介绍,有需要学习的朋友可以跳转到 ...

  7. js中判断一个对象是否存在

    一.Boolean()方法 用Boolean()方法可以将Js中的任意数据类型转为布尔值: 二.用于判断xx是否存在 js一般会自动执行Boolean()方法,我们可以借此判断某个对象在js当前的执行 ...

  8. JS 中判断一个对象是否为数组对象?

    在面向对象中 判断一个对象中 判断一个对象是否为数组 1 可以查找它的原型 (__proto__) 是否为数组对象的原型对象 var arr1 = [1,2,3];console.log(arr1._ ...

  9. JavaScript 日期比较——如何在 JS 中比较日期

    日期是开发人员在创建实际应用程序时最常用的数据类型之一. 但通常,开发人员会在这种数据类型上苦苦挣扎,最终使用像 Moment.js 这样的日期库来完成简单的任务,这些任务不值得安装整个包所带来的大包 ...

最新文章

  1. Python matplotlib 绘制散点图 还不收藏起来
  2. 测试工具/PostMan
  3. 2011年工作总结和展望(下篇)
  4. shardingjdbc全局表_sharding-jdbc实现按年分库按月分表
  5. 关于androidManifest.xml的概叙以及intent-filter的详细分析
  6. 基于特征点匹配的自适应目标跟踪算法
  7. react dispatch_React测试的那些事(三) React Hook 测试实例
  8. 解决ubuntu系统root用户下Chrome无法启动问题
  9. 红橙Darren视频笔记 旋转加载界面
  10. 白鹭引擎拉伸高度_摩托车界厚道王!129cc单缸风冷引擎,座高740mm+数字盘,6400起...
  11. SQL prompt无法激活跳转到127.0.0.1:22223的解决方案
  12. Windows XP操作系统自带工具应用详解(转)
  13. jdk1.8的安装与环境变量配置
  14. java poi 生成ppt表格,关于java使用POI导出ppt ,其中表格setText 失败问题
  15. JavaScript实现动态时间显示功能
  16. 【redis源码学习】rax,我愿称之为“升级版字典树”
  17. 《我要进大厂》- Java基础夺命连环10问,你能坚持到第几问?(面向对象基础篇)
  18. 用一个二维码做下载app,自动区分是 ios 还是 android
  19. 论文笔记:残差神经网络(ResNet v1)
  20. MySQL-间隙锁-加锁规则

热门文章

  1. Python爬虫实战案例一:爬取猫眼电影
  2. 从大一到大三,211数学系跨保985计算机保研准备经验
  3. Scratch编程开启小朋友们的奇妙创作之旅
  4. MSSQL2005_x64位标准版安装问题解决整理
  5. 树莓派 外接显示屏 黑屏不显示
  6. 一种可扩展、精确的激光雷达点云冬季除雪算法
  7. Oracle 12C -- 在相同的列的集合上创建多个索引
  8. 鼠标移入事件onmouseover、onmouseenter 鼠标移出事件onmouseleave、onmouseout 的区别
  9. POJ - 1847(朴素dijkstra)
  10. 学习编程的方法西安尚学堂