es5语法下,javascript如何判断函数是new还是()调用

Posted 名分开就是姓名

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了es5语法下,javascript如何判断函数是new还是()调用相关的知识,希望对你有一定的参考价值。

es5语法没有支持类class,但是可以通关函数来申明一个类,如下:

function Person(name){

  this.name=name;

}

var john=new Person(‘john‘);

console.log(john.name);//john

但是这个类可以直接像函数执行那样调用:Person()

判断是不是被new还是()调用得这样修改上面这个类:

function Person(name){

  this.name=name;

  if(this instanceof Person){

    alert(‘new调用‘);
  }else{
    alert(‘函数调用‘);
  }

}

new Person(‘xiaoqiang‘)//=> new调用

Person(‘xiaoqiang‘)//=>函数调用

还以用写法可以方便复制粘贴到任何类里面如下:

写法1:

function Person(name){

  this.name=name;

  if(this instanceof arguments.callee){

    alert(‘new调用‘);
  }else{
    alert(‘函数调用‘);
  }

}

new Person(‘xiaoqiang‘)//=> new调用

Person(‘xiaoqiang‘)//=>函数调用

写法2:

function Person(name){

  this.name=name;

  if(this.constructor === arguments.callee){

    alert(‘new调用‘);
  }else{
    alert(‘函数调用‘);
  }

}

new Person(‘xiaoqiang‘)//=> new调用

Person(‘xiaoqiang‘)//=>函数调用

 

看似上面三种写法都很完美,但是如何如下调用你就会蒙蔽

 

var jack=new Person(‘jack‘); //=>new 调用

jack.f=Person

jack.f(‘不信你试试‘) //=> new 调用

 










以上是关于es5语法下,javascript如何判断函数是new还是()调用的主要内容,如果未能解决你的问题,请参考以下文章

Babel

Babel

JavaScript ES5类 原型 原型链 组合原型寄生式继承

JavaScript语法

javascript中es6语法

webstorm下ES6转ES5