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对象及属性
Feb 13 Javascript
FormValid0.5版本发布,带ajax自定义验证例子
Aug 17 Javascript
JavaScript 序列化对象实现代码
Dec 18 Javascript
jQuery 学习6 操纵元素显示效果的函数
Feb 07 Javascript
用js模拟JQuery的show与hide动画函数代码
Sep 20 Javascript
微信小程序去哪里找 小程序到底如何使用(附小程序名单)
Jan 09 Javascript
如何编写jquery插件
Mar 29 jQuery
vue组件详解之使用slot分发内容
Apr 09 Javascript
JavaScript事件发布/订阅模式原理与用法分析
Aug 21 Javascript
使用layui的layer组件做弹出层的例子
Sep 27 Javascript
详解JSON.stringify()的5个秘密特性
May 26 Javascript
如何基于viewport vm适配移动端页面
Nov 13 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
sony ICF-2010 拆解与改装
2021/03/02 无线电
php下实现折线图效果的代码
2007/04/28 PHP
php设计模式 Singleton(单例模式)
2011/06/26 PHP
php堆排序实现原理与应用方法
2015/01/03 PHP
PHP CURL实现模拟登陆并上传文件操作示例
2020/01/02 PHP
javascript 操作文件 实现方法小结
2009/07/02 Javascript
innerText和textContent对比及使用介绍
2013/02/27 Javascript
网页防止tab键的使用快速解决方法
2013/11/07 Javascript
详解JS函数重载
2014/12/04 Javascript
常用的javascript设计模式
2017/01/11 Javascript
vuejs父子组件通信的问题
2017/01/11 Javascript
JavaScript实现图片切换效果
2017/08/12 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
Vue实现todolist删除功能
2018/06/26 Javascript
详解如何给React-Router添加路由页面切换时的过渡动画
2019/04/25 Javascript
vue实现点击出现操作弹出框的示例
2020/11/05 Javascript
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
Python中的anydbm模版和shelve模版使用指南
2015/07/09 Python
Python中的日期时间处理详解
2016/11/17 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
Python中enumerate()函数编写更Pythonic的循环
2018/03/06 Python
Python将string转换到float的实例方法
2019/07/29 Python
python构造IP报文实例
2020/05/05 Python
Python 合并拼接字符串的方法
2020/07/28 Python
Python爬虫实战案例之爬取喜马拉雅音频数据详解
2020/12/07 Python
用python 绘制茎叶图和复合饼图
2021/02/26 Python
纯CSS3实现表单验证效果(非常不错)
2017/01/18 HTML / CSS
CSS3之边框多颜色Border-color属性使用示例
2013/10/11 HTML / CSS
太阳镜仓库,售价20美元或更少:Sunglass Warehouse
2016/09/28 全球购物
DJI大疆德国官方商城:大疆无人机
2018/09/01 全球购物
天猫某品牌专卖店运营计划书
2014/03/21 职场文书
学校学习雷锋活动总结
2014/07/03 职场文书
行政文员实习自我鉴定范文
2014/09/14 职场文书
2014年英语教研组工作总结
2014/12/06 职场文书
《我的长生果》教学反思
2016/02/20 职场文书
Java 多态分析
2022/04/26 Java/Android