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

2019-12-24,,,

方式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的new Function()方法
  • js之ActiveX控件使用说明 new ActiveXObject()
  • Javascript new Date().valueOf()的作用与时间戳由来详解
  • 关于js new Date() 出现NaN 的分析
  • 在.NET中使用Newtonsoft.Json转换,读取,写入的方法介绍
  • javascript中IE浏览器不支持NEW DATE()带参数的解决方法
  • js中关于new Object时传参的一些细节分析
  • Javascript的无new构建实例详解

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

下载本文的Word格式文档,以方便收藏与打印。