JavaScript:new 一个函数和直接调用函数的区别分析


Posted in Javascript onJuly 10, 2013
function Test() { 
this.name = 'Test'; 

return function() { return true; } 
}

var test = new Test(); // 这里的 test 是什么?

是一个 Test 对象吗?错!这里 test 是一个函数——Test 中返回的 function() { return true; }。这时,new Test() 等效于 Test(),注意,是等效于,不是等于,如果使用new Test() == Test() 判定两者是否相等,则会返回 false,因为 Javascript  对于 Object 和 Function 的比较是基于引用的。

为了更清晰的分辨在上述情形下两者间的区别,请继续看以下代码:

function Test() { 
this.name = 'Test'; 

return 'Test'; 
} 
var fnT = Test(); 
var newT = new Test();

显然,fnT 是字符串 Test,那 newT 呢?呵呵,是不是被第一个样例迷惑了?其实,此时 newT 是一个 Test 对象——有一个名为 name 的属性,其值为字符串 Test。

通过上面两段代码,我们可以得出一个猜测,如果函数返回值为常规意义上的值类型(Number、String、Boolean)时,new 函数将会返回一个该函数的实例对象,而如果函数返回一个引用类型(Object、Array、Function),则 new 函数与直接调用函数产生的结果等同。通过在 Test 函数中返回不同类型的值进行测试,可以证实这一点。

分清这一点,其实还是蛮重要的,至少在看一些面向对象的框架类库代码时,会少一些疑惑。

Javascript 相关文章推荐
JavaScript多线程的实现方法
May 08 Javascript
js动态添加onload、onresize、onscroll事件(另类方法)
Dec 26 Javascript
利用Javascript判断操作系统的类型实现不同操作系统下的兼容性
Jan 29 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
Aug 03 Javascript
通过设置CSS中的position属性来固定层的位置
Dec 14 Javascript
jquery mobile 移动web(5)
Dec 20 Javascript
jquery限定文本框只能输入数字(整数和小数)
Jan 08 Javascript
浅谈jquery设置和获得checkbox选中的问题
Aug 19 Javascript
layui.js实现的表单验证功能示例
Nov 15 Javascript
在vue-cli搭建的项目中增加后台mock接口的方法
Apr 26 Javascript
基于vue实现一个禅道主页拖拽效果
May 27 Javascript
小程序websocket心跳库(websocket-heartbeat-miniprogram)
Feb 23 Javascript
浅析onsubmit校验表单时利用ajax的return false无效问题
Jul 10 #Javascript
JavaScript 模拟类机制及私有变量的方法及思路
Jul 10 #Javascript
js固定DIV高度,超出部分自动添加滚动条的简单方法
Jul 10 #Javascript
javascript 手动给表增加数据的小例子
Jul 10 #Javascript
基于javascript 闭包基础分享
Jul 10 #Javascript
关于include标签导致js路径找不到的问题分析及解决
Jul 09 #Javascript
等待指定时间后自动跳转或关闭当前页面的js代码
Jul 09 #Javascript
You might like
php access 数据连接与读取保存编辑数据的实现代码
2010/05/12 PHP
php中json_encode中文编码问题分析
2011/09/13 PHP
探讨捕获php错误信息方法的详解
2013/06/09 PHP
PHP下通过QRCode类库创建中间带网站LOGO的二维码
2014/07/12 PHP
修改jquery.lazyload.js实现页面延迟载入
2010/12/22 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
2015/08/06 Javascript
javascript实现的猜数小游戏完整实例代码
2016/05/10 Javascript
js验证手机号、密码、短信验证码代码工具类
2020/06/24 Javascript
在vue.js中抽出公共代码的方法示例
2017/06/08 Javascript
Angular项目中$scope.$apply()方法的使用详解
2017/07/26 Javascript
关于vue.js组件数据流的问题
2017/07/26 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
JS Testing Properties 判断属性是否在对象里的方法
2017/10/01 Javascript
vue 项目如何引入微信sdk接口的方法
2017/12/18 Javascript
Vue框架之goods组件开发详解
2018/01/25 Javascript
vue this.reload 方法 配置
2018/09/12 Javascript
Vue核心概念Action的总结
2019/01/18 Javascript
2020京东618叠蛋糕js脚本(亲测好用)
2020/06/02 Javascript
详解Vue之计算属性
2020/06/20 Javascript
巧用Python装饰器 免去调用父类构造函数的麻烦
2012/05/18 Python
scrapy爬虫实例分享
2017/12/28 Python
python中break、continue 、exit() 、pass终止循环的区别详解
2019/07/08 Python
python图形用户接口实例详解
2019/12/16 Python
简单了解python字符串前面加r,u的含义
2019/12/26 Python
Python绘制动态水球图过程详解
2020/06/03 Python
Python urlopen()参数代码示例解析
2020/12/10 Python
CSS3 transforms应用于背景图像的解决方法
2019/04/16 HTML / CSS
美国老牌主机服务商:iPage
2016/07/22 全球购物
事业单位竞聘上岗实施方案
2014/03/28 职场文书
减负增效提质方案
2014/05/23 职场文书
2015年教研员工作总结
2015/05/26 职场文书
研究生学习计划书应该怎么写?
2019/09/10 职场文书
Python基础之条件语句详解
2021/06/16 Python
MySQL的存储函数与存储过程的区别解析
2022/04/08 MySQL
Golang 切片(Slice)实现增删改查
2022/04/22 Golang
SQL Server中锁的用法
2022/05/20 SQL Server