【问题标题】:How to define a constructor?如何定义构造函数?
【发布时间】:2013-09-10 10:26:36
【问题描述】:

我需要一个不应作为函数调用的构造函数:

function Foo() {
  ...
};

var f = new Foo(); // ok
Foo();  // throws error

在这里搜索和found that 也许我可以使用以下来检查它是否作为函数调用

if (!(this instanceof arguments.callee))

如果是这样,我应该抛出什么错误?

还有,有没有更好的方法来定义构造函数?

【问题讨论】:

  • 如果你不希望它被作为函数调用,也许可以尝试使用单例并将构造函数设为私有?

标签: javascript oop


【解决方案1】:

arguments.callee(不幸的是,恕我直言)在 ES5 严格模式下已弃用。

如果调用者忘记使用new,我建议您实例化该对象,而不是抛出错误:

function Foo() {
    if (!(this instanceof Foo)) {
         return new Foo();
    }

    ...
};

【讨论】:

    【解决方案2】:
    if (!(this instanceof arguments.callee))
    

    arguments.callee 已弃用。只需使用正确的参考:this instanceof Foo

    如果是这样,我应该抛出什么错误?

    只是说明原因的正常错误:

    throw new Error("Foo must be called as a constructor");
    

    顺便说一句,您不妨容忍它并创建一个新实例:return new Foo()

    【讨论】:

      【解决方案3】:

      这个怎么样:

      /*WARNING CALL THIS ONLY AS A CONSTRUCTOR, NOT AS A FUNCTION*/
      

      【讨论】:

      • 不要愚蠢地假设每个用户都会阅读(并关注)此类文档 :-)
      • 我有点讽刺,但与此同时,汽车不会阻止您在发动机没有机油的情况下驾驶。您应该知道如何正确使用汽车,或阅读文档以了解如何操作。
      • JSDoc 格式:/** <newline> * @constructor <newline> */
      猜你喜欢
      • 2021-06-18
      • 2013-06-26
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 2012-03-16
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多