创建一个函数
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')
}
}