JavaScript中判断函数是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调用”,显然不对

还有更好的方法吗?


相关:

JavaScript中具名函数的多种调用方式(1)

JavaScript中具名函数的多种调用方式(2)

posted on 2011-04-03 10:41  snandy  阅读(5843)  评论(8编辑  收藏  举报