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 相关文章推荐
DOM 脚本编程中的兄弟节点
Oct 31 Javascript
Jquery Validation插件防止重复提交表单的解决方法
Mar 05 Javascript
js change,propertychange,input事件小议
Dec 20 Javascript
javascript学习笔记(一) 在html中使用javascript
Jun 18 Javascript
jqgrid 编辑添加功能详细解析
Nov 08 Javascript
JS按回车键实现登录的方法
Aug 25 Javascript
JSONP和批量操作功能的实现方法
Aug 21 Javascript
基于Vue实现页面切换左右滑动效果
Jun 29 Javascript
每天学点Vue源码之vm.$mount挂载函数
Mar 11 Javascript
Vue开发环境跨域访问问题
Jan 22 Javascript
原生JS实现萤火虫效果
Mar 07 Javascript
VSCode搭建React Native环境
May 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
第十二节 类的自动加载 [12]
2006/10/09 PHP
PHP之变量、常量学习笔记
2008/03/27 PHP
php相当简单的分页类
2008/10/02 PHP
php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
2012/11/01 PHP
PHP递归实现文件夹的复制、删除、查看大小操作示例
2017/08/11 PHP
JavaScript判断变量是对象还是数组的方法
2014/08/28 Javascript
AngularJs根据访问的页面动态加载Controller的解决方案
2015/02/04 Javascript
javascript检查浏览器是否已经启用XX功能
2015/07/10 Javascript
js跨域资源共享 基础篇
2016/07/02 Javascript
jquery-file-upload 文件上传带进度条效果
2017/11/21 jQuery
基于vue-cli创建的项目的目录结构及说明介绍
2017/11/23 Javascript
vue中的 $slot 获取插槽的节点实例
2019/11/12 Javascript
谈谈node.js中的模块系统
2020/09/01 Javascript
[05:04]完美世界携手游戏风云打造 卡尔工作室地图界面篇
2013/04/23 DOTA
python re模块的高级用法详解
2018/06/06 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
2018/07/13 Python
python multiprocessing模块用法及原理介绍
2019/08/20 Python
Python3-异步进程回调函数(callback())介绍
2020/05/02 Python
解决Django响应JsonResponse返回json格式数据报错问题
2020/08/09 Python
Python confluent kafka客户端配置kerberos认证流程详解
2020/10/12 Python
音乐表演专业毕业生求职信
2013/10/14 职场文书
初三家长会邀请函
2014/01/18 职场文书
宿舍打麻将检讨书
2014/01/24 职场文书
运动会入场词50字
2014/02/20 职场文书
股权转让协议书范本
2014/04/12 职场文书
2014年综治宣传月活动总结
2014/04/28 职场文书
节能环保家庭事迹材料
2014/08/27 职场文书
创先争优活动承诺书
2014/08/30 职场文书
2015年学校安全管理工作总结
2015/05/11 职场文书
2015年学校减负工作总结
2015/05/19 职场文书
安全教育观后感
2015/06/17 职场文书
公司管理制度范本
2015/08/03 职场文书
廉政党课工作报告案例
2019/06/21 职场文书
创业不要错过,这4种餐饮新模式
2019/07/18 职场文书
python基于OpenCV模板匹配识别图片中的数字
2021/03/31 Python
html5调用摄像头截图功能
2022/01/18 Javascript