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

标签 javascript static-methods

如何在不使用 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/

相关文章:

C++ 模板类从静态助手调用自己的构造函数

javascript - Next.js + Tailwind : no error, 中的自定义字体但字体错误

javascript - Jquery:取消绑定(bind)事件处理程序以便稍后再次绑定(bind)

javascript - 应用 laravel spatie/CSP 后猫头鹰轮播列表不会显示

C# 静态变量 - 范围和持久性

c# - Doxygen 不会生成指向没有显式类名的方法的链接

php - 从另一个静态方法调用静态方法 : PHP Fatal error: Call to undefined function

java - 为什么 Java System.in.read() 可以调用 which 不是静态方法

javascript - 未启用 Javascript 时的替代 anchor 标记

javascript - 用于扩展信息框的 Leaflet 事件监听器