Javascript——如何在不使用新操作符的情况下启用静态方法,同时防止使用实例函数

Javascript——如何在不使用新操作符的情况下启用静态方法,同时防止使用实例函数,javascript,static-methods,Javascript,Static Methods,如何启用静态方法的使用,同时防止在不使用新运算符的情况下使用实例函数?在下面的示例中,如果您尝试在没有新运算符的情况下调用构造函数,则构造函数将引发异常。不幸的是,这也阻止了对原型中真正的静态函数的访问,这些函数完全可以在不首先构造对象的情况下调用: 函数TestIt(){ if(this.constructor==arguments.callee&&!this.\u constructed) 这是真的; 其他的 抛出“必须使用新运算符调用此函数”; } TestIt.prototype.som

如何启用静态方法的使用,同时防止在不使用新运算符的情况下使用实例函数?在下面的示例中,如果您尝试在没有新运算符的情况下调用构造函数,则构造函数将引发异常。不幸的是,这也阻止了对原型中真正的静态函数的访问,这些函数完全可以在不首先构造对象的情况下调用:

函数TestIt(){
if(this.constructor==arguments.callee&&!this.\u constructed)
这是真的;
其他的
抛出“必须使用新运算符调用此函数”;
}
TestIt.prototype.someStaticMethod=函数(){
log('hello');
}
TestIt.prototype.someStaticMethod()//好啊
var t=新TestIt();
t、 someStaticMethod()//好啊
TestIt.someStaticMethod()//提出的例外情况
有没有办法让TestIt.someStaticMethod()在这个上下文中工作?
为什么
TestIt.someStaticMethod()
首先实际调用构造函数?这样做有点违反直觉。

如果调用构造函数时没有使用新函数,则测试该构造函数的更简单方法是:

function TestIt() {
  if (!(this instanceof TestIt)) {
    throw "this function must be called with the new operator";
  }
}
至于静态方法,您可能应该在类(构造函数)上而不是在原型上定义它们。实例可以访问在原型上定义的属性,而静态方法应该可以在类本身上访问

TestIt.someStaticMethod = function() {
  console.log('hello');
}

var t=new TestIt();
t.someStaticMethod(); // no method here, exception

TestIt.someStaticMethod(); // works

你是对的。它解决了问题!这么简单。关于
!(TestIt的这个实例)
,在他们推荐其他构造的地方,我没有看到它被推荐。答案是否不完整/错误?排名靠前的答案甚至被评为50…@user1471399该问题的问题是,同一个函数被用来构造一个对象,并被指定为该对象上的一个方法。我发现这样的边缘情况在实践中从来没有用处。“为什么TestIt.someStaticMethod()首先调用构造函数?”它没有。我很确定你会遇到类似“undefined不是函数”这样的错误。这是因为TestIt没有属性someStaticMethod。这与睾丸内发生的事情无关。