论坛首页 Web前端技术论坛

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

浏览 2376 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2011-01-19   最后修改:2011-04-03

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

这篇看看如何判断一个函数是被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调用”,显然不对
 

呃,还有更好的方法吗?

 

 

   发表时间:2011-01-20  

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

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

 this.name = n;
 this.age = a;
	
0 请登录后投票
   发表时间:2011-01-20  
补充:

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

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

0 请登录后投票
   发表时间:2011-01-20   最后修改:2011-01-20
to houfeng0923:

new Person(); 时就不行了。

谢谢你,但似乎无解。
0 请登录后投票
   发表时间:2011-01-24  
可以判断的,情况分支比较多。

你看我blog里的这篇吧:

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

0 请登录后投票
   发表时间:2011-01-25  
不明白应用场景,为嘛要知道?
0 请登录后投票
   发表时间:2011-01-25  
无解。
new的作用提供一个Person.prototype的复制,以此为基础来调用Person()方法。
假设Person里什么都没做。
new Person()出来的p和复制出来的obj没有任何区别。所以在这2个上面调用constructor,也就是Person函数,没有区别。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics