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

  还有更好的方法吗?