创建无法作为构造函数调用的JavaScript函数?

时间:2016-10-16 19:22:06

标签: javascript

有没有办法阻止在JavaScript中将新定义的函数作为构造函数调用?在调用它之前放置new时抛出错误。

3 个答案:

答案 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

Arrow function compatibility table