一、什么是new?

众所周知,在JS中,new的作用是通过构造函数来创建一个实例对象。

像下面这样:(和普通函数不一样,当函数用作 构造函数 时,首字母一般要大写,以作区分。)

function Foo(name) {    this.name = name;}console.log("new Foo('mm')的类型:",typeof new Foo('mm')); // objectconsole.log("Foo的类型:",typeof Foo); // function

二、new经历了什么过程?

Foo明明只是一个函数,可是为什么new Foo()执行后会突然返回一个对象呢?

我们从结果出发可以推断出,既然返回了一个对象,那么这事肯定和 对象 有关系。

实际上new帮我们做了这样几件事:

  1. 帮我们创建了一个空对象,例如:obj;
  2. 将空对象原型的内存地址 __proto__ 指向函数的原型对象;(这里涉及到了 原型链 的知识)
  3. 利用函数的call方法,将原本指向window的绑定对象this指向了obj。(这样一来,当我们向函数中再传递实参时,对象的属性就会被挂载到obj上。)
  4. 利用函数返回对象obj。

三、new的过程分析

function Foo(name) {    this.name = name;    return this;}var obj = {};obj.__proto__ = Foo.prototype;// Foo.call(obj, 'mm');var foo = Foo.call(obj, 'mm');console.log(foo);

分析:

首先预编译,声明提升,解释执行。

执行时按照顺序来进行,

  • obj指向空对象;
  • obj的原型地址指向构造函数Foo的原型对象;
  • 执行 Foo.call(obj, 'mm');this.name = name; 通过函数的 call方法 将this绑定到obj(也就是说this就是obj),实参mm传入构造函数Foo中,这样this.name = ‘mm’,那么obj.name = ‘mm’,也就是说name属性被挂载到obj对象上。return this; 就是return obj,这样obj这个对象就被返回出来了。
  • 将结果赋值给变量foo。
  • 打印结果。

四、总结

第三部分的代码直接用 new 构造函数 效果是相同的。

function Foo(name) {    this.name = name;}var foo = new Foo('mm');console.log(foo);

简而言之,new操作符帮我们做了四件事:

  1. 创建空对象;
  2. 空对象的原型指针指向构造函数的原型对象;
  3. 利用函数的call方法改变this指向,在空对象上挂载属性或方法;
  4. 返回对象。

js中的new file_JS中的new操作符相关推荐

  1. html img调用js,html调用js变量 如何在html中输出js文件中的变量

    html页面代码中怎么调用js变量?html页面代码中怎么调用js变量,例如 在html代码中插入js代码: a=取浏览你把index1.js 中的onReady 去掉,把index1.js改成 fu ...

  2. html js文本框文字列出,js实现文本框中输入文字页面中div层同步获取文本框内容的方法...

    这篇文章主要介绍了js实现文本框中输入文字页面中div层同步获取文本框内容的方法,实例分析了javascript操作dom元素的技巧,需要的朋友可以参考下 本文实例讲述了js实现文本框中输入文字页面中 ...

  3. SpringMVC js如何获取后台model中的属性值

    SpringMVC js如何获取后台model中的属性值 companylist 如何获取 var companylist="${companylist}"; 希望对你有所帮助 个 ...

  4. js中变量和jsp中java代码中变量互相访问解决方案

    1.js变量获取jsp页面中java代码的变量值.  方法:var JS变量名 = <%=JAVA变量名 %>   2.java代码获取js变量的值.  说明:在JSP中:Java部分是在 ...

  5. 前端知识点总结——JS高级(持续更新中)

    前端知识点总结--JS高级(持续更新中) 1.字符串 什么是: 连续存储多个字符的字符数组 相同: 1. 下标 2. .length 3. 遍历 4. 选取: slice(starti[, endi] ...

  6. js中onload和jQuery中的ready区别

    js中onload和jQuery中的ready区别 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行. ------>不能写多个(如果有多个,只会执行一个) $(do ...

  7. Windows 8 HTML5/JS评论引发开发者群中的慌乱

    为什么80%的码农都做不了架构师?>>> Windows 8 HTML5/JS Comment Causes Panic Among Developers Windows 8 HTM ...

  8. js 浅拷贝直接赋值_JS中实现浅拷贝和深拷贝的代码详解

    (一)JS中基本类型和引用类型 JavaScript的变量中包含两种类型的值:基本类型值 和 引用类型值,在内存中的表现形式在于:前者是存储在栈中的一些简单的数据段,后者则是保存在堆内存中的一个对象. ...

  9. js变量和java变量相等,js中变量和jsp中java代码中变量互相访问解决方案

    1.js变量获取jsp页面中java代码的变量值. 方法:var JS变量名 = 我们常常会将js文件和jsp文件分开写,在js文件中,上面的方法似乎不管用了. 也可以通过变通的方法来解决: a.js ...

最新文章

  1. spring cloud的网关服务Zuul
  2. 【Android 逆向】函数拦截实例 ( ③ 刷新 CPU 高速缓存 | ④ 处理拦截函数 | ⑤ 返回特定结果 )
  3. 利用kickstart实现pxe的自动化安装
  4. Ghost 2.16.3 发布,基于 Markdown 的在线写作平台
  5. js 原型prototype继承模式
  6. c++ why can't class template hide its implementation in cpp file?
  7. c#解决在数据表格中无法显示秒数问题
  8. css3 filter url,CSS3 filter(滤镜) 属性
  9. CentOs 7 Linux系统下我的/etc/sysconfig/路径下无iptables文件
  10. 计算机基础远程教育答案,浙大远程教育2013年计算机作业答案-1-计算机基础知识题.docx...
  11. https请求 nginx 不生效_nginx设置https后无法打开网页
  12. XPath解析xml文件、html文件
  13. 知识图谱最新研究综述
  14. 七. 多线程编程3.主线程
  15. mysql5.5软件官方下载_MySQL5.5 64位下载
  16. python工程师简历项目经验怎么写_班长项目经验简历范文
  17. node.js学习笔记(8)--multer模块文件上传
  18. 50个MySql语句
  19. php中where条件whereRaw,「laravel whereRaw 和 where(DB::raw(''))」- 海风纷飞Blog
  20. 使用分布式词汇对比词向量区分正反义词

热门文章

  1. 分布式解决方案之分布式日志采集elk+kafka 环境的构建
  2. centos7 修改yum源为阿里源
  3. 使用xfire webservice接口开发,obj与xml相互转换好用工具类,不需要写大量的转换代码,亲测可用
  4. -bash: lsof: 未找到命令
  5. vue 单文件组件中,输入template 按 tab 键不能自动补全标签的解决办法
  6. Android代码混淆方法,Android 代码混淆零基础入门
  7. python numpy sum函数,numpy.sum()的使用详解
  8. gbase 8s oracle,GBase8s 查看数据库表空间信息
  9. Python print 函数- Python零基础入门教程
  10. android实现qq修改密码底部弹出框_易查分强大的“可修改列”功能:轻松实现填表、留言和信息核对...