函数的双重调用

109 阅读1分钟

创建一个函数

function User(){

}

它可以User()调用,也可以new User()调用

为什么会出现这种情况,就要回顾到js的历史渊源

在js的创建之初是没有new User()这种调用方式的,由于当时java很火,布兰登.艾奇他老板就让他把js照着java抄,于是就出现了这种情况。

因为函数的二义性就导致js函数的复杂度直线上升,因为一个函数在创建的时候,创建者不知道未来的使用者会如何调用,有可能会通过new调用,也可能不会,不管怎么调用都不会报错,这就会存在很大的隐患。

随着es6出现,js官方给出了解决办法:

如果是构造函数可以通过class创建,但是这个class和java中的class本质上是不一样的,只是用法和看起来差不多。js中的class本质上还是一个function

class User {};

typeof User === 'function'

不通过new调用的话则会抛出错误

如果想定义一个普通函数,禁止用new调用应该怎么做呢?

es6中给了一个属性new.target,可以这样写

function User(){
  if(new.target){
    throw('Uncaught TypeError: User is not a constructor')
  }
}