文档章节

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

Andy0520
 Andy0520
发布于 2016/06/15 12:00
字数 404
阅读 33
收藏 0

或许许多人对此不以为然,在函数前加 new 关键字,不就是实例化一个对象吗?但事情显然没那么简单

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 函数中返回不同类型的值进行测试,可以证实这一点。     分清这一点,其实还是蛮重要的,至少在看一些面向对象的框架类库代码时,会少一些疑惑。

本文转载自:http://www.jb51.net/article/39653.htm

Andy0520
粉丝 12
博文 31
码字总数 3614
作品 0
嘉兴
程序员
私信 提问
JavaScript学习笔记-原型继承

JavaScript基于原型的编程语言,本身并不包含内置的类实现。但是可以通过Javascript模拟出类 类 JavaScript中有构造函数和New运算符。构造函数用来实例对象和初始化属性。任何JavaScript函数...

墨鱼ID
2012/09/06
1K
6
javascript引擎在c,c+中调用

JavaScript是一种广泛用于Web客户端开发的脚本语言,常用来控制浏览器的DOM树,给HTML网页添加动态功能。目前JavaScript遵循的web标准的是ECMAScript262。由于JavaScript提供了丰富的内置函数...

crossmix
2015/04/19
666
0
由Jquery创建对象引发的思考

读到jquery源码时我有以下疑惑 问题1 中创建对象的奥秘 问题2 中的指向问题 问题3 的作用 问题4 / 对象和类之间的关系 //代码1(Jquery 创建对象) 这时我有问题了,//1 处有无的区别。//2 处有...

_ivenj
09/29
0
0
JavaScript当中的this究竟是个啥?

对于JS的初学者而言,JS当中的this指向很难让人摸准其脉络,经常会给你一种模糊美、朦胧美的感脚!因为this并不是固定不变的,它会根据自身所执行的环境的不同而不同。而且在开发的过程中,经...

张培跃
2018/06/18
0
0
JavaScript终极BOSS_函数

你确定掌握了JS的函数,真的确定吗? 警告:最后一站:秋名山,座下乃AE86,无法保证不撒豆腐,路途颠簸刺激,请务必拉好扶手! JavaScript函数 函数过于恶心,我们由浅入深,一点一点来,相...

风蓝小栖
2018/08/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

华为手机翻译功能怎么使用?这三种方法请务必收藏

华为手机翻译功能怎么使用?在我们的生活中会经常遇到翻译问题,许多外语不好的朋友该怎么办呢?华为手机已经为我们解决了这个问题,今天小编就教大家学会使用华为手机中的三种翻译技巧,需要...

翻译小天才
32分钟前
4
0
企业服务软件开发中需要注意的三个问题

在开发企业服务软件时,我们需要分为:业务需求、用户需求、产品需求,三大需求层次,三个层次互相关联,企业服务软件开发首先要服务业务,需要满足业务的需求,再关注用户体验,也就是用户需...

积木创意科技
35分钟前
4
0
C++容器底层数据结构

内置数组: int arr[10][10];memset(arr,0,10*10*sizeof(int)); //初始化int tmp[10][10];memcpy(arr, tmp, 10 * 10 * sizeof(int));//拷贝 void *memcpy(void *destin, void *source,......

SibylY
36分钟前
3
0
Dubbo-自适应拓展机制

背景 在 Dubbo 中,很多拓展都是通过 SPI 机制进行加载的,比如 Protocol、Cluster、LoadBalance 等,这些都是Dubbo的基础组件。这些基础组件的拓展不是在系统框架启动阶段被加载,而是拓展方...

rock-man
今天
7
0
Kali安装fcitx输入法(五笔)

安装fcitx > sudo apt-get install fcitx-rime fcitx-config-gtk3 重启 > sudo reboot fcitx配置 效果就是这样 配置输入法切换 系统设置...

yeahlife
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部