js中的new file_JS中的new操作符
一、什么是new?
众所周知,在JS中,new的作用是通过构造函数来创建一个实例对象。
像下面这样:(和普通函数不一样,当函数用作 构造函数 时,首字母一般要大写,以作区分。)
function Foo(name) { this.name = name;}console.log("new Foo('mm')的类型:",typeof new Foo('mm')); // objectconsole.log("Foo的类型:",typeof Foo); // function
![](/assets/blank.gif)
二、new经历了什么过程?
Foo明明只是一个函数,可是为什么new Foo()执行后会突然返回一个对象呢?
我们从结果出发可以推断出,既然返回了一个对象,那么这事肯定和 对象 有关系。
实际上new帮我们做了这样几件事:
- 帮我们创建了一个空对象,例如:obj;
- 将空对象原型的内存地址 __proto__ 指向函数的原型对象;(这里涉及到了 原型链 的知识)
- 利用函数的call方法,将原本指向window的绑定对象this指向了obj。(这样一来,当我们向函数中再传递实参时,对象的属性就会被挂载到obj上。)
- 利用函数返回对象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);
![](/assets/blank.gif)
分析:
首先预编译,声明提升,解释执行。
执行时按照顺序来进行,
- 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);
![](/assets/blank.gif)
简而言之,new操作符帮我们做了四件事:
- 创建空对象;
- 空对象的原型指针指向构造函数的原型对象;
- 利用函数的call方法改变this指向,在空对象上挂载属性或方法;
- 返回对象。
js中的new file_JS中的new操作符相关推荐
- html img调用js,html调用js变量 如何在html中输出js文件中的变量
html页面代码中怎么调用js变量?html页面代码中怎么调用js变量,例如 在html代码中插入js代码: a=取浏览你把index1.js 中的onReady 去掉,把index1.js改成 fu ...
- html js文本框文字列出,js实现文本框中输入文字页面中div层同步获取文本框内容的方法...
这篇文章主要介绍了js实现文本框中输入文字页面中div层同步获取文本框内容的方法,实例分析了javascript操作dom元素的技巧,需要的朋友可以参考下 本文实例讲述了js实现文本框中输入文字页面中 ...
- SpringMVC js如何获取后台model中的属性值
SpringMVC js如何获取后台model中的属性值 companylist 如何获取 var companylist="${companylist}"; 希望对你有所帮助 个 ...
- js中变量和jsp中java代码中变量互相访问解决方案
1.js变量获取jsp页面中java代码的变量值. 方法:var JS变量名 = <%=JAVA变量名 %> 2.java代码获取js变量的值. 说明:在JSP中:Java部分是在 ...
- 前端知识点总结——JS高级(持续更新中)
前端知识点总结--JS高级(持续更新中) 1.字符串 什么是: 连续存储多个字符的字符数组 相同: 1. 下标 2. .length 3. 遍历 4. 选取: slice(starti[, endi] ...
- js中onload和jQuery中的ready区别
js中onload和jQuery中的ready区别 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行. ------>不能写多个(如果有多个,只会执行一个) $(do ...
- Windows 8 HTML5/JS评论引发开发者群中的慌乱
为什么80%的码农都做不了架构师?>>> Windows 8 HTML5/JS Comment Causes Panic Among Developers Windows 8 HTM ...
- js 浅拷贝直接赋值_JS中实现浅拷贝和深拷贝的代码详解
(一)JS中基本类型和引用类型 JavaScript的变量中包含两种类型的值:基本类型值 和 引用类型值,在内存中的表现形式在于:前者是存储在栈中的一些简单的数据段,后者则是保存在堆内存中的一个对象. ...
- js变量和java变量相等,js中变量和jsp中java代码中变量互相访问解决方案
1.js变量获取jsp页面中java代码的变量值. 方法:var JS变量名 = 我们常常会将js文件和jsp文件分开写,在js文件中,上面的方法似乎不管用了. 也可以通过变通的方法来解决: a.js ...
最新文章
- spring cloud的网关服务Zuul
- 【Android 逆向】函数拦截实例 ( ③ 刷新 CPU 高速缓存 | ④ 处理拦截函数 | ⑤ 返回特定结果 )
- 利用kickstart实现pxe的自动化安装
- Ghost 2.16.3 发布,基于 Markdown 的在线写作平台
- js 原型prototype继承模式
- c++ why can't class template hide its implementation in cpp file?
- c#解决在数据表格中无法显示秒数问题
- css3 filter url,CSS3 filter(滤镜) 属性
- CentOs 7 Linux系统下我的/etc/sysconfig/路径下无iptables文件
- 计算机基础远程教育答案,浙大远程教育2013年计算机作业答案-1-计算机基础知识题.docx...
- https请求 nginx 不生效_nginx设置https后无法打开网页
- XPath解析xml文件、html文件
- 知识图谱最新研究综述
- 七. 多线程编程3.主线程
- mysql5.5软件官方下载_MySQL5.5 64位下载
- python工程师简历项目经验怎么写_班长项目经验简历范文
- node.js学习笔记(8)--multer模块文件上传
- 50个MySql语句
- php中where条件whereRaw,「laravel whereRaw 和 where(DB::raw(''))」- 海风纷飞Blog
- 使用分布式词汇对比词向量区分正反义词
热门文章
- 分布式解决方案之分布式日志采集elk+kafka 环境的构建
- centos7 修改yum源为阿里源
- 使用xfire webservice接口开发,obj与xml相互转换好用工具类,不需要写大量的转换代码,亲测可用
- -bash: lsof: 未找到命令
- vue 单文件组件中,输入template 按 tab 键不能自动补全标签的解决办法
- Android代码混淆方法,Android 代码混淆零基础入门
- python numpy sum函数,numpy.sum()的使用详解
- gbase 8s oracle,GBase8s 查看数据库表空间信息
- Python print 函数- Python零基础入门教程
- android实现qq修改密码底部弹出框_易查分强大的“可修改列”功能:轻松实现填表、留言和信息核对...