如何在不使用 new 运算符的情况下启用静态方法,同时阻止使用实例函数?在下面的示例中,如果您尝试在不使用 new 运算符的情况下调用构造函数,构造函数将引发异常。不幸的是,这也阻止了对原型(prototype)中真正静态函数的访问,这些函数完全可以在不先构造对象的情况下调用:
function TestIt() {
if(this.constructor == arguments.callee && !this._constructed )
this._constructed = true;
else
throw "this function must be called with the new operator";
}
TestIt.prototype.someStaticMethod=function() {
console.log('hello');
}
TestIt.prototype.someStaticMethod(); //ok
var t=new TestIt();
t.someStaticMethod(); //ok
TestIt.someStaticMethod(); //exception raised
有没有办法让 TestIt.someStaticMethod()
在这种情况下工作?
为什么 TestIt.someStaticMethod()
实际上首先调用构造函数?这样做有点违反直觉。
最佳答案
测试构造函数是否在没有 new 的情况下调用的更简单方法是:
function TestIt() {
if (!(this instanceof TestIt)) {
throw "this function must be called with the new operator";
}
}
对于静态方法,您也许应该在类(构造函数)而不是原型(prototype)上定义它们。原型(prototype)上定义的属性可供实例访问,而静态方法应可在类本身上访问。
TestIt.someStaticMethod = function() {
console.log('hello');
}
var t=new TestIt();
t.someStaticMethod(); // no method here, exception
TestIt.someStaticMethod(); // works
关于Javascript——如何在不使用 new 运算符的情况下启用静态方法,同时防止使用实例函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25506610/