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 继承详解(一)
Jul 13 Javascript
用jquery ajax获取网站Alexa排名的代码
Dec 12 Javascript
用dtree实现树形菜单 dtree使用说明
Oct 17 Javascript
javascript针对DOM的应用分析(四)
Apr 15 Javascript
JavaScript学习笔记之数组的增、删、改、查
Mar 23 Javascript
JS实现将数字金额转换为大写人民币汉字的方法
Aug 02 Javascript
JavaScript浏览器对象模型BOM(BrowserObjectModel)实例详解
Nov 29 Javascript
详解jQuery简单的表单应用
Dec 16 Javascript
JS实现针对给定时间的倒计时功能示例
Apr 11 Javascript
基于vue实现网站前台的权限管理(前后端分离实践)
Jan 13 Javascript
js遍历详解(forEach, map, for, for...in, for...of)
Aug 28 Javascript
详解微信小程序之提高应用速度小技巧
Jan 07 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
第六节--访问属性和方法
2006/11/16 PHP
基于PHP的简单采集数据入库程序
2014/07/30 PHP
php中实现可以返回多个值的函数实例
2015/03/21 PHP
thinkPHP5框架路由常用知识点汇总
2019/09/15 PHP
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
2007/03/12 Javascript
解决iframe的frameborder在chrome/ff/ie下的差异
2010/08/12 Javascript
javascript 常用功能总结
2012/03/18 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
2013/06/08 Javascript
给ListBox添加双击事件示例代码
2013/12/02 Javascript
xmlhttp缓存清除的2种解决方法
2013/12/13 Javascript
JavaScript获得当前网页来源页面(即上一页)的方法
2015/04/03 Javascript
JavaScript中实现Map的示例代码
2015/09/09 Javascript
轮播的简单实现方法
2016/07/28 Javascript
JS动态加载脚本并执行回调操作
2016/08/24 Javascript
js初始化验证实例详解
2016/11/26 Javascript
javascript事件的传播基础实例讲解(35)
2017/02/14 Javascript
node.js操作mongodb简单示例分享
2017/05/25 Javascript
老生常谈js中的MVC
2017/07/25 Javascript
JS动画实现回调地狱promise的实例代码详解
2018/11/08 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
2019/03/29 Javascript
JS函数动态传递参数的方法分析【基于arguments对象】
2019/06/05 Javascript
使用python 和 lint 删除项目无用资源的方法
2017/12/20 Python
Windows下Anaconda安装、换源与更新的方法
2020/04/17 Python
python语言中有算法吗
2020/06/16 Python
莫斯科大型旅游休闲商品超市:Camping.ru
2020/09/16 全球购物
学校卫生检查制度
2014/02/03 职场文书
大型晚会策划方案
2014/02/06 职场文书
《苏珊的帽子》教学反思
2014/04/07 职场文书
村干部培训方案
2014/05/02 职场文书
感恩老师的演讲稿
2014/05/06 职场文书
卖房协议书样本
2014/10/30 职场文书
2014年学生会主席工作总结
2014/11/07 职场文书
运动员入场前导词
2015/07/20 职场文书
使用Redis实现实时排行榜功能
2021/07/02 Redis
SpringBoot快速入门详解
2021/07/21 Java/Android
Sleuth+logback 设置traceid 及自定义信息方式
2021/07/26 Java/Android