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

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

时间: 2024-10-10 18:15:29

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

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

复制代码 代码如下: 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() ==

&#106avascript写作技巧,函数A中调用函数B, 怎样在函数B中写代码中断函数A的运行?

函数|技巧 function funcA(){        funcB();       //other code } 怎么定义函数B,让B在运行的时候不仅能终止B本身,而且能终止函数A的运行?  这是个非常规的问题,我们分两大部分讨论. (1.为什么一定这样做 2.怎么实现) 1. 显然,这种编码方式已经打乱了正规的程序编写原则,我们编写函数的目的就是为了封装,为了实现代码的模块化. 如果B能让A退出返回, 那这种编码方式肯怕比滥用 goto 语句还滥了. 这样做有必要吗?为什么一定要这样做

eigen 声明 调用函数-Eigen在调用函数里面的问题

问题描述 Eigen在调用函数里面的问题 C++中声明一些矩阵时,使用eigen很方便,而且eigen里面的一些函数用起来也很方便.我想问一下对于调用的一些函数可以使用eigen声明吗?像可以这样写:double a[3],b[3][3];然后调用函数ma(a,b).但是声明如果换成Vector,Matrix,用eigen的话,后面调用再这么写的话就会出错,求大神指点,能否给个实例程序!

Javascript基础教程之定义和调用函数_基础知识

函数是一个可以随时运行的语句,简单说,函数是完成某个功能的一组语句,它接受0或者多个参数. 函数的基本语法如下 复制代码 代码如下: function functionName([arg0,arg1,......argN]){ statement [return[expression]] } 其中,function为自定义函数的关键字,functionName为函数名,arg表示传给函数的各种参数列表,各个参数之间使用逗号隔开.参数可以为空. statement为函数 本省,可以是各种合法的代码

java-JavaScript中,一个对象不能直接调用函数而要先把函数赋给一个对象属性?

问题描述 JavaScript中,一个对象不能直接调用函数而要先把函数赋给一个对象属性? 解决方案 你定义了两个变量,一个person对象,一个getName方法,他们之间没有任何联系,你怎么能通过person来调用getName呢? 解决方案二: JavaScript:new 一个函数和直接调用函数的异同如何在javascript中new一个对象并且赋给它属性和方法javascript函数也是一个对象 解决方案三: var person = { "name": "Lily&

javascript面向对象编程:js类定义函数时用不用prototype的区别

一直在使用js编写自以为是面向对象的方法,遇到一个问题,就是定义一个方法,如下: function ListCommon2(first,second,third) { this.First=function () { alert("first do"+first); } } ListCommon2.do1=function(first) { // this.First(); alert("first do"+first); } ListCommon2.prototy

php中动态调用函数的方法

 这篇文章主要介绍了php中动态调用函数的方法,实例分析了php动态函数的实现原理与具体实现步骤,需要的朋友可以参考下     本文实例讲述了php中动态调用函数的方法.分享给大家供大家参考.具体分析如下: php中你可以动态调用函数,分为以下步骤: 1. 定义一个函数 2. 将函数名(字符串)赋值给一个变量 3. 使用变量名代替函数名动态调用函数 详细代码如下所示: ? 1 2 3 4 5 6 7 <?php function addition ($a, $b){ echo ($a + $b)

调用函数-C++/C#的函数内嵌问题

问题描述 C++/C#的函数内嵌问题 int a(){ int c=1; int d=2; int e=3; return c+d+e;}int b(){ int c=a(); int d=a(); int e=a();}上面是简单例子 函数a里有很多对象,函数b里也有很多对象与a重复,假设这种情况不可避免,对象有很多修改很不方便.现在我想调用函数b,却发现调用函数b必须调用函数a,于是我想把函数a整合到函数b里面去,这样我以后只需要调用一个函数就行了因为如果我调用函数b时的函数b需要调用很多个

Lua中调用函数使用点号和冒号的区别_Lua

本文是面向对象预热篇,讲解函数两种调用方式的区别,初学者比较容易被坑. 1.初学者最易混乱Top1--调用函数时用点号还是用冒号? 我们来看看下面的两句代码: 复制代码 代码如下: mSprite.setPosition(100, 20); mSprite:setPosition(100, 20); 对于初次接触Lua的朋友来说,这简直就是噩梦,为嘛函数的调用有两种形式,是让我们随便挑的意思吗?   这两种形式是有区别的,区别很大,但只有一个. 不过,暂时不解释,后面再介绍. 2.最简单的类 我