当前位置: 代码迷 >> Web前端 >> 判断函数是new仍是()调用
  详细解决方案

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

热度:269   发布时间:2012-10-25 10:58:57.0
判断函数是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调用”,显然不对
?

呃,还有更好的方法吗?

?

?

1 楼 houfeng0923 2011-01-20  

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

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

 this.name = n;
 this.age = a;
	
2 楼 houfeng0923 2011-01-20  
补充:

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

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

3 楼 zhouyrt 2011-01-20  
to houfeng0923:

new Person(); 时就不行了。

谢谢你,但似乎无解。
4 楼 cuixiping 2011-01-24  
可以判断的,情况分支比较多。

你看我blog里的这篇吧:

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

5 楼 goldduck 2011-01-25  
不明白应用场景,为嘛要知道?
6 楼 dojotoolkit 2011-01-25  
无解。
new的作用提供一个Person.prototype的复制,以此为基础来调用Person()方法。
假设Person里什么都没做。
new Person()出来的p和复制出来的obj没有任何区别。所以在这2个上面调用constructor,也就是Person函数,没有区别。
  相关解决方案