有没有办法阻止在JavaScript中将新定义的函数作为构造函数调用?在调用它之前放置new
时抛出错误。
答案 0 :(得分:3)
您可以通过查看是否是自身的实例来检查是否使用new
调用了某个函数
function test() {
if ( this instanceof test ) {
throw "Oh God no, not a new one !"
}
}
var a = test(); // success
var b = new test(); // fail
在ES2015中,new.target
元属性可让您直接检查new
是否用于调用方法
function test() {
if (new.target) {
throw "Oh God no, not a new one !"
}
}
答案 1 :(得分:2)
你可以在函数中检查this.constructor
:
function f() {
if (this && this.constructor === f) {
throw new Error("Don't call f as a constructor")
}
}
f(); // ok
new f(); // throws
正如@squint指出的那样,如果明确设置f.prototype.constructor
,则可以中断此检查:
f.prototype = {
constructor: "not f!"
}
new f(); // doesn't throw
答案 2 :(得分:1)
如果您的环境支持它们,您可以使用箭头功能:
const f = () => "test"
f() // returns "test"
new f() // throws TypeError: f is not a constructor(…)
请注意,箭头函数从定义它们的范围继承this
。这与function
不同(其中this
通常取决于函数的调用方式),所以你可以不要总是把它们作为替代品。
如果将箭头函数作为构造函数调用,Babel当前不会抛出异常:Babel REPL example。