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 学习笔记之一jQuery写法图片等比缩放以及预加载
Jun 28 Javascript
js截取字符串的两种方法及区别详解
Nov 05 Javascript
jquery 新建的元素事件绑定问题解决方案
Jun 12 Javascript
jQuery中extend函数详解
Jul 13 Javascript
JS+CSS实现仿支付宝菜单选中效果代码
Sep 25 Javascript
JavaScript关联数组用法分析【概念、定义、遍历】
Mar 15 Javascript
深入理解Vue 的条件渲染和列表渲染
Sep 01 Javascript
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
Nov 27 Javascript
vue.js学习笔记之v-bind和v-on解析
May 03 Javascript
JavaScript中为事件指定处理程序的五种方式分析
Jul 27 Javascript
详解vue-router传参的两种方式
Sep 10 Javascript
JQuery animate动画应用示例
May 14 jQuery
浅析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中smarty模板条件判断用法实例
2015/06/11 PHP
PHP内存使用情况如何获取
2015/10/10 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
Yii2框架实现登陆添加验证码功能示例
2018/07/12 PHP
js判断FCKeditor内容是否为空的两种形式
2013/05/14 Javascript
jquery ajax jsonp跨域调用实例代码
2013/12/11 Javascript
JS动态调用方法名示例介绍
2013/12/18 Javascript
2种jQuery 实现刮刮卡效果
2015/02/01 Javascript
JavaScript数据绑定实现一个简单的 MVVM 库
2016/04/08 Javascript
AngularJS利用Controller完成URL跳转
2016/08/09 Javascript
jQuery查找节点方法完整实例
2016/09/13 Javascript
jQuery web 组件 后台日历价格、库存设置的代码
2016/10/14 Javascript
BootStrap Fileinput的使用教程
2016/12/30 Javascript
基于AngularJS的简单使用详解
2017/09/10 Javascript
vue中子组件向父组件传递数据的实例代码(实现加减功能)
2018/04/20 Javascript
jQuery鼠标滑过横向时间轴样式(代码详解)
2019/11/01 jQuery
微信小程序仿淘宝热搜词在搜索框中轮播功能
2020/01/21 Javascript
element中el-container容器与div布局区分详解
2020/05/13 Javascript
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
2018/01/20 Python
python脚本作为Windows服务启动代码详解
2018/02/11 Python
Django框架中序列化和反序列化的例子
2019/08/06 Python
基于python检查矩阵计算结果
2020/05/21 Python
button在IE6/7下的黑边去除方案
2012/12/24 HTML / CSS
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
NFL墨西哥官方商店:Tienda NFL
2017/11/28 全球购物
俄语专业毕业生推荐信
2013/10/28 职场文书
红旗方阵解说词
2014/02/12 职场文书
简单的大学生自我鉴定
2014/02/18 职场文书
学生鉴定评语大全
2014/05/05 职场文书
考试诚信承诺书
2014/05/23 职场文书
2016年猴年新春致辞
2015/08/01 职场文书
教师节感想
2015/08/11 职场文书
创业计划书之美甲店
2019/09/20 职场文书
Nginx设置日志打印post请求参数的方法
2021/03/31 Servers
使用python向MongoDB插入时间字段的操作
2021/05/18 Python
python如何正确使用yield
2021/05/21 Python