`
zhouyrt
  • 浏览: 1128012 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

判断函数是new还是()调用

 
阅读更多

具名函数的各种调用方式 在一年前已经总结过了。

这篇看看如何判断一个函数是被new调用的,还是被其它方式调用的。

 

方式1

function Person(n,a){    
	this.name = n;
	this.age = a;

	if(this instanceof Person){
		alert('这是new调用');
	}else{
		alert('这是普通函数调用');
	}
}
var p = new Person('jack',30); // --> 这是new调用
Person(); // --> 这是普通函数调用

 

方式2

function Person(n,a){    
	this.name = n;
	this.age = a;

	if(this instanceof arguments.callee){
		alert('这是new调用');
	}else{
		alert('这是普通函数调用');
	}
}
var p = new Person('jack',30); // --> 这是new调用
Person(); // --> 这是普通函数调用
 

方式3

function Person(n,a){    
	this.name = n;
	this.age = a;

	if(this.constructor === arguments.callee){
		alert('这是new调用');
	}else{
		alert('这是普通函数调用');
	}
}
var p = new Person('jack',30); // --> 这是new调用
Person(); // --> 这是普通函数调用

 

看似很完美,但当把函数/类作为自身实例对象的方法时调用就出问题了

function Person(n,a){    
	this.name = n;
	this.age = a;

	if(this.constructor === arguments.callee){
		alert('这是new调用');
	}else{
		alert('这是普通函数调用');
	}
}
var p = new Person('jack',30); // 先new一个对象
p.fn = Person; // 把函数/类 Person 赋值给自身对象p的fn属性
p.fn(); // 这句调用时提示“这是new调用”,显然不对
 

呃,还有更好的方法吗?

 

 

分享到:
评论
6 楼 dojotoolkit 2011-01-25  
无解。
new的作用提供一个Person.prototype的复制,以此为基础来调用Person()方法。
假设Person里什么都没做。
new Person()出来的p和复制出来的obj没有任何区别。所以在这2个上面调用constructor,也就是Person函数,没有区别。
5 楼 goldduck 2011-01-25  
不明白应用场景,为嘛要知道?
4 楼 cuixiping 2011-01-24  
可以判断的,情况分支比较多。

你看我blog里的这篇吧:

“函数中判断自己是以怎样的形式被调用的”
http://blog.csdn.net/cuixiping/archive/2011/01/24/6160456.aspx

3 楼 zhouyrt 2011-01-20  
to houfeng0923:

new Person(); 时就不行了。

谢谢你,但似乎无解。
2 楼 houfeng0923 2011-01-20  
补充:

if((this instanceof Person)&&this.name===undefined){
	alert('这是new调用');
 }else{
	alert('这是普通函数调用');
}

 this.name = n;
 this.age = a;
	

1 楼 houfeng0923 2011-01-20  

不是很清楚这样的用意,但你可以这样试试:

if((this instanceof Person)&&!this.name){
	alert('这是new调用');
 }else{
	alert('这是普通函数调用');
}

 this.name = n;
 this.age = a;
	

相关推荐

    JavaScript中判断函数是new还是()调用的区别说明

    具名函数的各种调用方式 在之前篇幅中已经介绍过了。这篇看看如何判断一个函数是被new调用的,还是被其它方式调用的。

    vue逐行注释分析+40多m的vue源码程序流程图思维导图

    1.vue源码读取流程 1.new Vue 调用的是 Vue.prototype._init 从该函数开始经过 $options 参数合并之后 initLifecycle 初始化生命周期标志初始化事件,初始化渲染函数。初始化状态就是数据。把数据添加到观察者中实现...

    andriod-dail:Dail是基于eclipce andriod平台开发的软件,主要功能是调用。 本软件只是模仿简单的函数调用

    安卓拨号Dail是基于eclipce andriod平台开发的软件,主要功能是调用。 本软件只是模仿简单的函数调用。... 通过TextUtils.isEmpty函数判断电话号码是否为空。 最后添加android.permission.CALL PHONE权限,最终调

    函数调用制作多个滚动的JS代码

    //这个变量用于判断滚动条是否已经到了尽头 this.mTimeToScroll = timeToScroll; //设定多少时间滚动一次 this.mMarqueesHeight = marqueesHeight; //内容区高度 this.marqueesWidth=marqueesWidth;//内容区宽度...

    用 Python 编写的判断素数的代码-new.docx

    用 Python 编写的判断素数的代码 def is_prime(n): if n return False for i in range(2, int...然后,在 main 部分,通过用户输入一个正整数,并调用 is_prime 函数判断该数是否为素数。根据返回值打印相应的结果

    MFC的程序框架剖析

    7、对于普通的VC++控制台程序,无论全局变量还是全局对象,程序运行时,在加载main函数之前,就已经为它们 分配了内存空间。对于一个全局对象来说,此时就会调用该对象的构造函数,构造该对象,并进行初始化操作 8、...

    javascript函数的解释

    47.当在超链接中调用JS函数时用:(javascript:)来开头后面加函数名 48.在老的浏览器中不执行此JS:<!-- //--> 49.引用一个文件式的JS:<script type="text/javascript" src="aaa.js"></script> 50.指定在不支持脚本的...

    JavaScript构造函数原理及实现流程解析

    在学习构造函数之前我们需要知道我们学习构造函数需要学习什么: ...2.当我们需要调用构造函数时我们需要new <构造函数>,也就是产生一个实例化对象。 function Student(name,age,sex,height){ this.name=name;

    js es6系列教程 – 基于new.target属性与es5改造es6的类语法

    es5的构造函数前面如果不用new调用,this指向window,对象的属性就得不到值了,所以以前我们都要在构造函数中通过判断this是否使用了new关键字来确保普通的函数调用方式都能让对象复制到属性 function Person( uName ...

    ImageEx类显示gif动画实例程序+源码 该类继承自GDI+库的Image类

    你只能调用下面位数不多的几个public成员函数,调用Destroy成员函数后,则就可以了,因为它会关闭线程。 其实你会发现下面的public成员函数操作的成员变量都是新增的成员变量,没涉及到线程同步问题。 class ...

    全面剖析this指向!

    文章目录调用位置绑定规则一、 默认绑定严格模式二、隐式绑定隐式丢失三、显示绑定硬绑定API调用的“上下文”四、new绑定箭头函数中的this指向判断this的优先级 调用位置 在理解this得绑定过程之前,首先要理解调用...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    话框类,将其加入工程中,然后在程序中调用自己新建的对话框类来实现多窗口。 实现过程: 1.首先新建Qt4 Gui Application 工程,工程名为nGui,Base class 选为QWidget。 建立好后工程文件列表如下图。 2.新建对话...

    sqlserver自定义函数

    [ @newname = ] 'new_name' [ , [ @objtype = ] 'object_type' ] --假设要处理的表名为: tb --判断要添加列的表中是否有主键 if exists(select 1 from sysobjects where parent_obj=object_id('tb') and xtype...

    C++复习资料之系列

    下面选项中,不正确的调用是( c )。 (a) double x = 2.17 ; fun1( x ); (b) int a = 15 ; fun1( a*3.14 ) ; (c) int b = 100 ; fun1( & b ); (d) fun1( 256 ); 3.有函数原型 void fun2( int * ); 下面选项中...

    JS和html实现的猜数字小游戏实现.html

    JS和html实现的猜数字小游戏实现码中的JavaScript部分主要是通过两个函数guessNumber()和newGame()来实现猜数字游戏的功能。 当玩家输入数字,点击“猜一下”按钮或按下回车键时,guessNumber()函数会被调用。在该...

    HGE_系列教材(1-9)

    ne 调用一次,函数返回true,则调用停止: bool FrameFunc() { if (hge->Input_GetKeyState(HGEK_ESCAPE)) { return true; } return false; } 3. 建立一个WinMain 函数,WinMain 函数是标准的Windows 应用程序入口,...

    VC++常用的共用函数100多页

    ◆如何在多文档MFC程序中制作独立的File|New菜单?◆ 33 ◆如何检测视是否处于分割状态?◆ 34 ◆如何使程序保持极小状态?◆ 34 ◆如何确定当前进程实例是否为唯一实例?◆ 35 ◆如何向一个文档附加多个视?◆ 35 ...

    javascript 数据类型转换(parseInt,parseFloat)

    Number、String函数是特殊的函数,在JS引擎中,他会自动判断是作为构造函数调用还是普通调用,所以既可以使用new关键字,也可以作为函数直接调用。

    JAVA期末作业打飞机游戏设计(程序+论文).zip

    首先显示的是游戏的背景介绍(图4-1),为此,在类lzhhdm定义Form类对象a,在startApp()函数中判断isSplash是否为真,如果为真的话,将创建Form类的实例a,并且调用append()方法在表单上放置StringItem类的实例以...

Global site tag (gtag.js) - Google Analytics